It's taken a while, but I've finally managed to get to the bottom of this issue after unintentionally reproducing it.
It seems that the .NET 4.5 installer introduces a subtle change in the garbage collection behaviour of the CLR, which affects not only .NET 4.5 but also other installed versions of the framework before it.
The change appears to suppress garbage collection of objects created inside of a try block, even when the garbage collector is being specifically invoked with a GC.Collect(). The objects are instead collected after the try/finally block has been fully executed.
The reasoning behind this isn't clear to me, as objects that are created and go out of scope inside a try block shouldn't really have a reason to exist. I would speculate that this change was introduced as a part of another change to generally improve reliability or make space for more features in the CLR.
Anyway, the change causes some problems for NCrunch when executing tests that are similar to the one you've described above, as NCrunch uses try/finally blocks as part of its performance analysis instrumentation. As described above, to work around the issue, just disable the 'Analyse line execution times' project-level NCrunch configuration setting for the project making use of the WeakReference.