One thing you can try is splitting the variables so you dont make the engine compute the same thing multiple times. The engine is sometimes smart enough to realise that something was already computed but not always.
Try one variable for
LASTDATE ( LineItem[Opportunity Line End Date] )
LASTDATE ( ReferenceDate[Reference Date] )
And one for
FIRSTDATE ( LineItem[Opportunity Line Start Date] )
Variables are only computed once, since you are using one of those expression 4 times, that should help at least something on your performance.