What are the Images in the UV editor for and how to prevent them affecting OBJ export?
I think I've found a workable answer. My fragment of python for setting these images to None was almost there, there's a more in depth version in this answer:
How to unlink material from a mesh, with python script?
I keep my materials, but the answer also covers this UV tex_face property that is the problem.

The whole tex_face feature is going away in 2.8 (which is a good thing as it's old and really well hidden and rarely used):
https://developer.blender.org/T51382

However there is one more crucial step which is to drop out of edit mode, otherwise none of the changes to the uv_texture images take effect before the export goes out, see the gotchas here:
https://docs.blender.org/api/2.79/info_gotcha.html#modes-and-mesh-access

So my final code fragment is as follows:

bpy.ops.object.mode_set(mode='OBJECT')

# Strip all the tex_face data, otherwise the obj export will use it
# We want it to use the material textures.
for mesh in bpy.data.meshes:
    if mesh.uv_textures.active is not None:
        for tf in mesh.uv_textures.active.data:
            tf.image = None

for mesh in bpy.data.meshes:
    for texlay in mesh.uv_textures:
        for tf in texlay.data:
            tf.image = None


Now my export seems to be behaving itself.