I've figured it all out!
First of all, the height in the speedbar and the height in the cockpit are both "above sea level" and not particularly fine-grained, while the height in the wonderwoman/F-35 view is "above ground level" and accurate to the nearest metre.
Secondly, the height you hear over the radio isn't necessarily the height of the waypoint. They only recorded a few voice samples for height readings: 01, 05, 10, 15, 20, and so on. When the announcement comes over the radio, the game takes the waypoint height in 100s of metres, and rounds down to the nearest multiple of 5 (or to 01 if it's less than 500m). But the aircraft ignore that instruction and adjust to fly at the height of the waypoint itself.
I first noticed this when playing a Russian mission just now. There were two flights - one at 2500m and another at 3000m, and I got to hear radio traffic from both and verify their heights by flying abreast of them. It seemed like the radio was giving the right heights for once. Then I went back to the original P-51B mission, but this time I modified the waypoint heights. I've listed, in order, the waypoint height in metres, the radio announced height in metres and feet, and the height we ended up flying at:
Code:
300m -> 01 (350) -> 350m
900m -> 05 (1500) -> 910m
1200m -> 10 (3500) -> 1210m
1800m -> 15 (5000) -> 1800m
2400m -> 20 (6500) -> 2400m
5000m -> 50 (16500) -> 5000m
As you can see, the height you fly at is very close (up to the accuracy of the altimeter) to the waypoint height.
A similar thing happens with the heading, but there's one of those for every 30 degrees so you're less likely to notice it. Plus, the heading only makes sense if you're starting from the actual waypoint so if you're off a little the heading will be too and it'll be your fault - not the game's. Taking the nearest reading seems like a good idea and 30 degrees seems accurate enough for our purposes.
I do wish that the game would round to the nearest sample instead of just rounding down all the time - perhaps they can remember that for the next game.
Thanks to all of you for your ideas and comments.