Render on integer/pixel coordinates and don't scale your view (or only scale it by factors of 2).
The issue is once you tell OpenGL to render something that is smaller than a pixel, it has to do some interpolation and decide how it should render this small pixel, which then can lead to behavior as described.
By sticking to integer coordinates, OpenGL doesn't have to interpolate, and no unwanted distortions appear.
Some effects can be mitigated with a render texture that is used before rendering to the screen, but it won't solve everything.