In MDX blanks are equal to 0 so checking for =0 will also overwrite blanks. You should explicitly check for non-empty by doing something like the following in your assignment.
THIS=IIF( NOT( ISEMPTY( [Measures].[Budget Amount 2 - EDIT] ) ) ,0.000000000000001,[Measures].[Budget Amount 2 - EDIT]);
Although this is still likely to be slow as you are crossjoining the leaves of 5 dimensions and forcing the engine to re-aggregate on the fly. So if you can - you would be better off implementing this in your ETL or in your views/DSV and taking it out of the calc script. This also feels like its a work around for some other issue, so maybe looking for an alternate solution for that would be better.