When loading the scaled model, the model isn't 10 units height but 10*17. Plus the 1/17-transfrom from the scaling doesn't apply. Only the 1/15 from the ellipsoid applies, i.e. you work with a height of around 11 in ellipsoid space instead of 0.039 as you would do with the smaller model.
rotateMesh() makes the current rotation matrix permanent by changing the actual mesh data. Scaling is part of the rotation process, which is why this works for scaling too. An example: Your mesh has a single vertex (1,2,3). This is the value of the vertex in object space no matter which scaling you set for the model. But when you call rotateMesh(), the vertex will be changed to (1*scale,2*scale, 3*scale). That's why you have to reset the scaling afterwards, because you would get x*scale*scale in world space otherwise.
I don't know exactly why both approaches differ in world space after loading. I think it has something to do with the origin that is part of the xml. Try to load your model, build it, set origin to (0,0,0) and save it as xml. That should give you a "clean" model with origin at (0,0,0) in the xml. Load that, scale it, apply rotateMesh(), set scale back to 1, build it.