NCrunch's enginehost contains almost all memory allocated by the engine. This is to try and keep as much of NCrunch away from devenv.exe as possible.
As such, the enginehost contains an extensive code model of your entire solution and of its tests. The largest area of memory consumption is usually the code coverage index, where all your code coverage data is stored.
Setting the engine host to run in an x86 process (through the 'Engine hosting strategy' configuration setting) will quite significantly reduce the memory footprint of the enginehost, as the coverage index is mostly made up of a large number of very small objects and x86 processes consume less memory for pointer based types.
Unfortunately reducing the amount of memory consumed by the code coverage index isn't feasible without massive performance degradation. Higher memory consumption in this situation seemed to be the lesser of two evils.