Recover Context after redraw
The solution was to Override the Context
Before calling redraw, create the override
override = context.copy()
After redraw, set the area on the override instead of the context object
override['area'].ui_type = 'IMAGE_EDITOR'
Any bpy.ops.* calls must pass the override as the 1st argument eg:
bpy.ops.image.save_as(override, filepath = fileName)