Is it possibly to monitor which particles are actually being processed by the physics engine? If so, is there a way whereby you can stop processing their physics, or severely limit what is processed, if their velocity is less than 0.01 or something of the like?
If you only process the particles that need processing, then you can have as many as you like, assuming that they are not all moving at once!
If this is still a problem, it sounds like a fluid dynamics solution may be more fitting, as fluid dynamics is basically a whole lot of small, moving particles.
Here is some interesting information on 2D fluid dynamics:
http://www.ibiblio.org/e-notes/webgl/gpu/fluid.htm
Your physics engine may already contain what you need.