The warning is NOT saying that a latch is being inferred or created (did you click on it or search the Xilinx web-site to see a detailed explanation of it?).
Instead, it is informing you that the register value never changes from the init value, and therefore is not truly needed and can be replaced by a constant logic level.
This logic level could in-turn be optimized during synthesis to be absorbed into the LUT logic equations.
This is actually a good thing, because otherwise you would be consuming flop resources that actually contribute nothing.
Stepping back, there could be a better way to tackle the overall issue and avoid any warnings, but I am not sure what that is, and I'm not sure this is really a problem.
The problem is that you are indexing into an array that has a non-power-of-2 dimension, but you still must use a power-of-2 register to index into it.
Furthermore, XST apparently must create a Z out of the array when it gets indexed outside of its bounds.
It is possible that there are other ways to prevent that Z assumption from happening, maybe via "pragmas" in the RTL or some kind of other option or setting.
I have had a similar situation using Design Compiler for an ASIC flow, but this Z-assumption did not happen.
(Synopsys Design Compiler behavior differs from XST in this situation.)
Instead, I simply got warnings about simulation mismatches due to the index being able to go outside of the array bound, and behavior was undefined if that actually happened.
(i.e. the value from the array was not predictable, but also I did not care)
But I also was not using multi-dimensional arrays, so perhaps that is also related to why this is happening.
You might be able to search for an app-note or Q&A about this on Xilinx's web-site, since they are the ones who developed and own the XST tool.
Also keep in mind that having warnings like this one is not necessary a bad thing, as long as you completely understand what it is telling you.
Finally, you might consider instead using true RAMs, and changing the 2-dimensional index into a one-dimensional index.
e.g. index = (row_counter << 3) + j; // assumes inner-dimension is 8
This may waste some of the RAM, but would still use less resources than creating a RAM out of discrete flops and LUTs (assuming you have RAM blocks available in your device).
And, the behavior would no longer need to create Z's from tristates.