It's because of how the rasterizer works. Your screen has pixels to display things. If the pixel align 1:1 then everything is great and you get a solid line. But if you put your line between two pixels, OpenGL has to decide how to render this, how to rasterize this, and there are multiple "solutions" to it. One it can decide to not render it (disappears), or it can decide to render both adjacent pixels some value of gray (if say the pixel was black), that way it might try your brain into thinking that in the sum total of the two it becomes black again, even if it's technically wider. And depending on the movement, you can also get one frame the one and the next frame the other solution, which then leads to more flickering.
If you instead make sure that all lines always align with the pixels, then there's no need for making such decisions.
For completeness' sake, there's one additional thing to consider, one-width lines (i.e. LineStrip) don't have their "position" at the top left corner of the line, but the vertex is actually in the center of the pixel. So in such cases, you may actually want to offset the line by 0.5, so it's dead center on the pixel.