The correct solution is using MAX instead of LASTDATE:

Last Balance :=
CALCULATE (
    SUM ( Accounts[Balance] ),
    FILTER ( ALL ( Accounts ), Accounts[Date] = MAX ( Accounts[Date] ) ),
    VALUES ( Accounts[Account] )
)

The LASTDATE function internally executes a context transition. You can think that the syntax

LASTDATE ( table[column] ) 

Internally corresponds to:

CALCULATETABLE ( 
    FILTER ( 
        ALL ( table[column] ), 
        table[column] = MAX ( table[column] ) 
    ) 
)

For this reason, calling LASTDATE when you have a row context (as it is the case in the FILTER of the original Last Balance formula) generates a context transition, and the internal MAX function only consider the date of the current row in the accounts table during the FILTER in Last Balance.

Remember: LASTDATE is a table function, which is useful to use in a filter argument of CALCULATE, whereas MAX is a scalar function, which cannot be used in a filter argument. For this reason, you can write:

CALCULATE ( <expression>, LASTDATE ( table[column] ) )

But you cannot write this:

CALCULATE ( <expression>, MAX ( table[column] ) )

You have to write:

CALCULATE ( <expression>, table[column] = MAX ( table[column] ) )

Which corresponds to:

CALCULATE ( 
    <expression>, 
    FILTER ( 
        ALL ( table[column] ), 
        table[column] = MAX ( table[column] ) 
    ) 
)