The correct solution is using MAX instead of LASTDATE:

1
2
3
4
5
6
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] )
    )
)