The main difficulty is that in order to determine the forces applied to each object, the collision response system must be run. Unfortunately, the collision response system is one of the largest expenses in the engine; if deactivation depends on collision response, it won't save much time.
Activation currently occurs based on simulation islands. These islands groups of entities that could possibly interact. The bounding boxes of entities are chosen as the metric of 'closeness,' so there can be a small airgap while still belonging to the same island.
Using a collision pair's contact count for a tighter fit was another option. However, contact count has a much higher change frequency, which increases the number of simulation island merge/splits substantially in certain simulations. Additionally, large piles would still generally be mega-islands, so it's unclear how much this would help the problem.
The deactivation system is slated for significant revisions in coming versions, so I may be able to overcome some of these issues.
So basically, this is a bit of a hard problem and the above doesn't help too much in actually solving your current issue.

The engine can't make too many assumptions about the configuration of the physics objects, but you may be able to. If your simulation design can safely guarantee that, even though entities might be in the same simulation island, far away entities won't be meaningfully affected by an interaction, you could add in some sort of hack.
One possible hack would be to remove entities from the space when they're far away from the 'player', if such a thing exists. Of course, you'd have to worry about stacking dependencies when removing objects, and removing entities does wake up a simulation island- if only momentarily. If your game doesn't have a localized physical 'player' and interactions can happen anywhere at any time, things become even trickier, unfortunately.
Other than hacks, you could also change the simulation design somewhat so that mega-islands are rare, and moving things around only activates maybe a few dozen entities rather than a mountain. Depending on the simulation, this might not be feasible.
You could also try to tweak the simulation settings so that even when things activate, it runs at an acceptable speed:
-Lowering the space.simulationSettings.collisionResponse.iterations typically improves performance at the cost of collision response accuracy.
-If you have continuous collision detection on (it's off by default), turning it off might save a few percent.
-Ensure multithreading is enabled if you have a multicore CPU.
You can change the deactivation settings (space.simulationSettings.deactivation) so that even if things wake up, they go back to sleep quickly:
-Velocity clamping changes small velocities to zero so that the system can go to sleep faster.
-Clamping time is the length of time before such small velocities get set to zero.
-You could also try forcing the numEntitiesToTryToDeactivatePerFrame to something extremely high to ensure that every simulation island is checked every frame.
Numerous speedups will also be coming in upcoming versions (mostly due to the collision detection system rewrite). If the performance gap isn't too large, it might just be bridged by gradual improvements to the engine.