Why does an update function loop when string property is reset?
In the execute method of the Test_Op class, you should access the property like this to prevent the update method from being called:

bpy.context.scene.test_vars["test_update_string"] = ""