You must be doing something else wrong in your code at some place not shown in your code snippet and the mentioned 'Graphic' class.
Maybe you reference the public static sideLength field somewhere else in your application, possibly when you set the viewport or some projection/view matrices.
Your mentioned Graphics class however seems to be just fine.
You are doing some unnecessary no-op pushMatrix, loadIdentity and popMatrix in makeTileVBO() though, which you can get rid of, but that's not the issue here.
Other than that, your interleaved VBO is setup correctly and draw() also sets correct pointer stride and offset.
Currently, I see nothing wrong with just that Graphic class.
But, the fact that hoisting the integer division / 2 out of the float array initialization into the sideLength field gives different results for you, can only mean that there is some other code depending on sideLength not shown here, which influences the final rendering result.
That all is very very likely neither a bug in LWJGL nor in OpenGL.