Thanks Stan. I think you gave me the hint to solve the problem!
My projection was setup like this:
g_Ortho = glm::ortho( 0.0f, (GLfloat) g_ScreenWidth, (GLfloat) g_ScreenHeight, 0.0f, 0.0f, 1000.0f );
..and g_Ortho is fed into my shader program.
When I switch to using the FBO, I should be configuring the ortho projection for the FBO as well - and to use the texture width and height instead of the screen width and height.
Awesome! Thanks for pointing me in the right direction. Funny, I tried changing the g_ScreenHeight inside the glReadPixels() code and that wasn't working either - because the whole projection must have been a mess.