Great question!
The answer is, unfortunately, buried in the Formal Specifications. But long story short, you'll want to wrap the Get-Asset operation in a with executionPolicy = always block.
For more information, note that there are three modes of executions:
Collect Only - only ICollectingOperation operations will run; if the operation is a IComparingOperation, then drift may be indicated. All ensure operations implement both interfaces.
Collect then Execute - a collection pass is performed as described above; if any drift is indicated, an execution pass is performed that runs:
operations that indicated drift
IExecutingOperation operations in the same scope as a drift-indicating operation that do not implement - IComparingOperation; this is all execution actions
operations with an execution policy of AlwaysExecute; this can only be set on a Context Setting Statement
Execute Only- only IExecutingOperation operations will run; all ensure and execute operations implement this interface
So what's happening is that Get-Asset will never run in a Collect pass, where as Ensure-DscResource will always run in a Collect pass (but only in Collection mode). By forcing Get-Asset to always execute, it will run even in the collect pass.
By the way: I would love to find a way to properly document the answer to this, so users don't get frustrated; any suggestions on where to edit the contents?