bpy.ops.render.render() freezes Blender when used in an addon
That is because Blender operators are modal: They block code execution until finished. The execute function is called in the same thread in which the GUI is drawn - So your Blender GUI freezes until the render is finished. A similar question with a solution can be found here:
Is it possible to make a sequence of renders and give the user the option to cancel the process through the UI at any given time?