Ok, here's my final demo till Friday 16th.
This shows one way of using a texture atlas of tiles with a texture map. The texture map uses the red and green components to give the UV offsets into the texture atlas (note that I erroneously said yesterday that you could use four texture atlases per texture map - as soon as I started coding it I realised you could only use two since you have two offsets per atlas - unless you are prepared to do more messing about

).
The demo shows the texture atlas on the left hand side of the screen, the final textured object in the middle, and the texture map on the right hand side. You should also be able to see undesirable seams in the middle image. The demo assumes that you want the final object to be tiled 3x3 - you can change this in the demo.
I suspect the seams are caused by at least two things:
1. the linear filtering
2. numerical inaccuracies in the calculation of the offsets.
Also, I'm not sure whether the gradients have been handled correctly yet.
On that last point, my first version of this demo had "tex2D" instead of "tex2Dgrad" by mistake. As far as I can tell the two versions do the same thing when the gradients are supplied as in this line:
Out.col = tex2Dgrad(baseSample, UV, test * ddx(In.dUV), test * ddy(In.dUV)); // attempt to remove mipmapping seams
- and that's suggested by the DX9 documentation although not explicitly stated since the Help file entries appear to be the same.
[The "test *" bits in that line are purely temporary test code to see what's going on.

]
The next step is to surround each sub-texture with an appropriate border. This should deal with point 1 above - and at the same time tell us whether the gradient version of the texture lookup has succeeded.
Hopefully I'll find time to deal with that at the end of the week (I'm busy with other things till then

).