After looking at the source code for Micropolis (the open-source release of SimCity) and doing some testing, it looks like the answer is "land value".
Each zone type has certain requirements in order to grow; these requirements are adjusted by the global demand to determine if the zone actually grows. If the requirements stop being met, the zone will shrink and eventually become abandoned.
For industrial, it's simple: the zone must be connected to power and the transportation network.
Commercial is slightly more complex: in addition to power and transport, there's a slight bias towards the "center of mass" of your city, measured by the Manhattan metric. The magnitude of this bias is small in comparison to the effect of global demand (about 4% as strong), so you'll only ever see it when demand is near-neutral for long periods of time.
Residential has by far the most complicated requirements beyond simple power and transportation. Conceptually, it's simple: the land value minus the pollution level, modified by global demand, must be above a certain minimum amount. The formula for land value is:
(34 - capped Manhattan distance from city center)*4 + terrain value - pollution value.
If crime > 190 (very high) then subtract 20
"Capped Manhattan distance" is a value between 0 and 32, equal to twice
the distance from the city center as measured by the Manhattan metric.
Terrain value is based on the number of nearby water, forest, and park tiles (but not fountain tiles -- this appears to be a bug), with the tiles immediately adjacent having the greatest influence.
If, like I did, you're using parks simply as filler, and you're packing your zones as tightly as possible, this means that residential zones outside a 64-tile radius of the center and away from rivers and lakes have a value near 0. The influence of global demand is only about a third as strong as land value, so they won't grow.