@dennemark, unfortunately I was unable to find a better solution than what you are already doing since we can’t do multiple passes and we aren’t able to modify the depth slope of the triangles in node material. The only suggestion I have for you would be to scale the float that you are multiplying your UVs with based on the scale you are passing to the mesh. This would eliminate the problem with minimal management in your code.
Obviously, if you were to split the meshes this could handled by the zOffset in the node material. And in your example of a pond in the middle of a ground plane, I would want a separate shader on the water anyway. Even for a stylized effect that has no vertex displacement, I would want some sort of motion in a pattern in the base color to imply water. For the ground, you would want a different/simpler shader but if both were using the same shader, you would be paying for the heavier water shader for every pixel of ground that bypasses that technique in the shader. You increase your cost with an additional material and mesh, but you save on per-pixel operations, so you may end up ahead in that sense.
And if you are going with a simple representation of water and ground through single colors, you could still do that all in one shader on one mesh with no coplanar faces by allowing the shader to create the color breaks for you. You also have the added benefit of more resolution in the texture that you likely would in mesh. This technique would need to use math to create your color breaks and not textures as you would be limited by texel density if using textures. However, you should be able to create pond-like shapes and position them within your ground plane programmatically if you like.
All of these directions rely heavily in your camera placement, scene complexity, how you want the user to interact, etc. so there is no silver bullet here. I wish I could have given you a better answer, but there are a lot of trade-offs here.