I take this back.

It turns out the Layer III global_gain field can be modified after all, with the net effect of increasing or decreasing the overall gain of the output just as you might expect. To be consistently uniform, it needs to be offset by the same amount in every channel in every granule in every frame (two channels per granule in stereo streams, and two granules per frame.) The code I posted earlier should provide enough information to locate the field(s) within a frame.
Sorry I goofed when I tested this before. I have no idea what I was doing.

I might even have enough code to compute an appropriate offset value in order to normalize the output... if anyone still has any interest in this, let me know.
-v