I haven't compared the performance differences (this is all very very new to me) but from a general programming perspective I'd imagine setting a distinct horizontal cutoff plane at compile-time (although alterable at runtime) might be a tad more efficient than even sporadic collision detection, at the expense of being just a plane through a given point with a pre-set orientation.
I'm talking about the Operator "Cull when crossing plane" set to use a Control Point to position things.
If you had rain and an outdoor elevator, you could use this method to dynamically prevent rain from going "Below" the platform, even as it rises or falls.
For an interesting effect, there's an operator "set control point to player". Combined with offset controls, this can let you create particles which disappear the instant they pass "below" player's eyeballs. (The plane is being constantly redefined relative to the player's position.)
It may be possible to use another control point to scale the horizontal area that particles are generated in, but I haven't found it yet. Maybe some of the weird "Remap distance between control points to scalar" operators, but I'm not sure how to chain those yet.
Edit: Looks like more of the "Remap" operators only allow you to modify particle properties rather than, say, the properties of the emission scheme. There might still be some way to do it with child particles and invisible parents, but...
Also, a flat plane for rain would work fine as long as the insides of your buildings didn't have visible arches and rafters. I wish we could seed a particle system with inputs that aren't simply control point vectors :/