I'm not sure you understand the concepts fully. Imagine you have a large texture which consists of 4x4 small textures in it (one image with 4 sub images, I will use the term small textures to represent these sub images below), also imagine a 2x2 tile grid that you want to draw.
Now lets draw some tiles, I want the first 4 small textures (first row) of the large texture to be drawn in the 2x2 grid. First of all I work out the verticies of the 2x2 grid. We now need to assign some texture coordinates.
All the vertices in the top left should be assigned the texture coordinate of the 1st small texture (remember the larger texture has coordinates 0-1 in the x and y direction so the small textures will have a 0.25 width and height).
(0,0),(0,0.25),(0.25,0.25),(0.25,0)
Then the vertices in the top right would be assigned the next small texture
(0.25,0),(0.5,0),(0.5,0.25),(0.25,0.25)
and so on for the remaining 2 tiles
After adding the indexe array you should be able to build a VBO
And so on.
So build your VBO, bind your texture once and draw elements should do its job.
Now if you want to swap out the first tile for another, you leave all your vertices the same, you index array the same but you just change you texture coordinates to be the texture coordinates of the small textures you want to draw. All you need to do is then rebind the VAO, and then bind the new texture coordinates.
No offscreen rendering required, just a simple VAO update everytime you want to change the tile setup. Texture coordinates can be used more than once, its just a case of choosing the small textures to use.