You could try to make a material with variables that modify the UV coordinates settings.
First have a node to shift the texture so that the selected square is centered, and then have the texture scale up by 200% so it fills up the entire uv space.
For every different tile block you create a material instance, with the custom variables selecting which part of the texture to use.
Additionally you could use vertex colors to manage the selection of the correct tile to allow you to apply only one material on all surfaces and have the vertex color decide what texture is used on what surface.
If that makes sense
Also be sure that for this type of texturing you select the correct type of texture filtering (or no filtering) in the texture options, so you dont end up with a blurry mess with colors bleeding through the edges of the tile.
In the free forest assets (from the kite demo) at the marketplace, they also use similar tiling for creating low detail trees.
Here is a screenshot. If you download the demo, the material is called “flipbook”