Instability of Win9x or stability of WinNT all depends on how you've got it set up and what it's running on. I leave mine running for days at a time, and only usually reboot when I'm installing software that needs it (or pretends to) or when I'm making performance changes. My NT4 workstation with a PIII/550 at work is slower than my K62-400 was and needs rebooting every day to really work well. Why is it like that? My home machine was customer designed by me and all the software and hardware has been tweaked and made sure of compatibility. The one at work is a POS corporate machine with Registry hacks and extra software loaded which I have limited control over. I COULD make this machine run a lot better, but it shows that WinNT isn't automatically better than Win98.
Anyway, software cooling does work quite well if your CPU is idle most of the time. You wouldn't want to use it exclusively, especially if you do a lot of CPU crunching stuff like 3D games.
Software cooling, like Rain or CPUIdle, use the HLT (halt) instruction built into modern CPU's. NT/2k have that function built into their code, and so do the various *NIX flavors. Win9x OS's don't have it. So you use Rain or CPUIdle. The HLT instruction is issued by the software any time there is not an active process in the CPU. Since most of the CPU's time is spent waiting for I/O to complete (hard drive, memory, USB), the HLT instruction is used quite a bit under normal load. This means that every cycle that's idle sort of just doesn't happen, the CPU is halted. No cycle means no heat is created by that cycle. Overall, the non-occurance and non-heating of those cycles means the CPU doesn't build up as much heat. A very small heatsink and fan could be used on your system then, which makes it easier to use extremely small cases (having that built into Win9x could have helped the movement to smaller FlexATX cases occur faster, since OEM's would know the heatsink didn't need to be as big).
However, this still depends on the CPU being idle much of the time. 3D games take up a LOT more cycles than normal use, therefore there is more heat buildup. Running Rain or CPUIdle while playing a game can help somewhat to reduce the heat increase, however it can't stop it completely, and a larger heatsink would be needed to deal with it effectively. Essentially the heatsink needs to be large enough to deal with the expected maximum heat production, not the average.
If you run Seti@Home or Distributed Computing's client, then Rain or CPUIdle become irrelevant. The client being run takes up any idle CPU cycles itself, and the HLT instruction runs at a lower level. Therefore the client program takes priority and makes use of the idle cycles, leaving none for the HLT instruction to act on, therefore providing no cooling. (You can see those programs running by watching any CPU monitor, which will show the CPU pegged at 100%. Many of them also misinterpret the HLT instruction being run as a real instruction being processed, and say your CPU is at 100% when using Rain, when in fact it just means that 100% of the cycles are either processing data or being halted.)