It's a "one thing led to another" situation.
1) Windows programs expect those variables.
2) They are user dependent and must be changed following a setuid.
3) Due to a Windows quirk, some of the computation must be done *before*
exec'ing the program following a setuid. That eventually led to
generating the stuff on the fly and storing it in the cygheap.
4) If they don't exist in the current environment, they are only
produced when exec'ing potential Windows programs (see mount -X)
Given 1) and the effort made in 4), we can argue forever whether it's
a bug. An alternative would be to only regenerate these variables
following a setuid. I vaguely recall doing that at some point.