Usually not a problem, as long as the back side is not visible
I don't get what you mean, the smoke particles are ALWAYS facing the camera, so there is nothing called back side at all, because the back side never face the camera.
it may be something that can be handled with drawing order and manipulating zbuf test and zbuf write.
Any idea how to modify the zbuffer to prevent the smoke particles from penetrating the walls?
1. Use soft particles to remove this hard penetration.
I think soft particles will only make soft edges when the particles are penetrating a mesh, but it won't make it invisible when it pass the wall (while the smoke should never pass the wall).
2. Use yours/anothers physics library to detect collision between the particles and the surroundings and then do the desired action.
If this is the appropriate way, I need more details, how to do so? Should I make a plane physics shape for EACH particle? I'm using Bullet Physics.