The solution is to have a separate table of date sizes so that the balance can be independently calculated based on the month without taking into account the fact table.
Suppose you have a date table named Date.
So first create a basic measure
[Total Balance] := SUM( FactTable[Balance] )
Then we calculate the first month in the fact table to use as a floor to view our Date table values.
[First Ever Balance Date] := FIRSTDATE( ALL( FactTable[Date] ) )
And now we define the last date with the balance for the date range between this first month and the current month in context:
[Last Balance Date] := LASTNONBLANK ( DATESBETWEEN ( Date[Date], [First Ever Balance Date], MAX ( Date[Month] ) ), [Total Balance] )
So, consider a111 on the month of 5/1/2015. This measure will look in all dates between 1/1/2015 (our [First Ever Balance Date] ) and 5/1/2015 ( MAX Date[Month] ), find the last line with the balance and return the corresponding Date[Date] (2 / 1/2015).
This measure returns BLANK within any month prior to the original account balance. Using BLANKS in date filtering does not work, so we must replace these BLANK values ββwith [First Ever Balance Date] to ensure that the current balance for this account will still be returned.
[Last Balance Date Remove Blanks] := IF ( ISBLANK ( [Last Balance Date] ), [First Ever Balance Date], [Last Balance Date] )
Now we can calculate the current balance of any account for any month by looking at the balance with Last Balance Date Remove Blanks
[Last Balance] := CALCULATE ( [Total Balance], DATESBETWEEN ( Date[Date], [Last Balance Date Remove Blanks], [Last Balance Date Remove Blanks] ) )
And finally, we use SUM via accounts to add our individual Last Balance amounts.
[Account Total Balance] := SUMX( ALL( FactTable[Account] ), [Last Balance] )
Now in the pivot table, you simply put Date [Month] in the rows and [Account Total Balance] as a measure. Note that this will include months without rows of a fact table such as 4/1/2015 in your sample set. If you want to exclude them, add another intermediate measure to count the rows of the fact table:
[Fact Table Row Count] := COUNTROWS ( FactTable )
And then create a measure to return BLANK () if [Fact table row table] BLANK (), and otherwise [Total account balance]
[Account Balance Hide Rows] := IF ( ISBLANK ( [Fact Table Row Count] ), BLANK (), [Account Balance] )