What you can do is set up a stream of particles moving in Y. using bounding box $BBY, setup groups for different parts of the mushroom cloud: ie. group any particle whose $BBY is greater than a normalized value or height. You can setup multiple groups corresponding to different heights of your upward particle stream.
Next you can setup various attractor systems using metaballs in SOPs to control swirling motion of your plume. Apply different attractor forces to different bounding box groups (having to do with BBY values). Using an Interact POP, for example, with high charge values to really spread the particles once they pass a certain height. Next, you can also use say Winp POP to push the particles in specific directions to get swirling.
It seems to boil down to combining various forces (Wind, attractors, interact) to get one final effect.
Just a thought
The rest boils down to endless tinkering of parameters to get the specific look.