Sorry to take so long to answer. The question fell into that awkward area between " answerable in less than 10 minutes" and " so long that I need to schedule it".
You cannot currently override the OS2/usWinAscent without changing glyphs. MakeOTF sets the usWinAscent to the top of the font global bounding box. It ignores the font BBOX def:
/FontBBox {-350 -299 3884 701} readonly def
as this is bad data in many fonts.Instead, it calculates the actual global font BBox by looking at the max values for any glyph in the font.
Note that you do not necessarily want the usWinAscent/Descent to be the same as usTypoAscent/Descent. The latter must sum to the em-square, the former do not. (although I do not know enough to tell you why)
If there is no OS/2 CapHeight override, it is set to:
top of uppercase O, with overshoot removed, e.g
glyph O bbox top - bbox bottom.
If there is no OS/2 XHeight override, it is set to:
top of lowercase o, with overshoot removed, e.g
glyph o bbox top - bbox bottom.
OS2-usWinAscent is first set to the top of the global font bounding box , and OS2-winDescent is set to the bottom of the global font bounding box. Howver, if the span of the two is greater than the emsquare size, then the usWinAscent is truncated so that they sum to the em-square.
If there is no OS/2 TypoAscender override. MakeOTF uses the larger of the bbox height of 'd' or the font Cap Height, as calculated above.
If there is no OS/2 table override for TypoDescender, MakeOTF uses (em-square size - OS/2 TypoAscender)
The two values must sum to the em-square size.
If there is no OS/2 override for typoLinegap, it is set to:
EM_SCALE(1200) (TypoAscender + TypoDescender).
These rules were worked out so that the font metrics and lconsequent ayout of text as reported via the Windows GDi and the Mac OS 9 Font Manager would be the same.