How to use bpy ops that take a modifier Enum as an argument?
Tested with the default scene in editmode with a single vertex selected.

 import bpy
 vertex_idx = 0
 obj = bpy.context.object
 other_obj = [o for o in bpy.context.scene.objects if o != obj][0]


 mod_name = "Hook" + str(vertex_idx)
 obj.modifiers.new(mod_name, type='HOOK')
 obj.modifiers[mod_name].object = other_obj

 bpy.ops.object.hook_assign(modifier=mod_name)


This worked for me, however this code shows a common mistake,

That is that you're assuming Blender is giving you the name you ask for,
There is no guarantee you get the name you ask for when creating new data. (it could be shortened or have a .001 added if the name exists already).

So best use the modifier name directly.

eg:

 mod = obj.modifiers.new("Hook" + str(vertex_idx), type='HOOK')
 mod.object = other_obj

 bpy.ops.object.hook_assign(modifier=mod.name)