I think it is because you are mixing code techniques. You are using the bpy.ops tools to manage the objects then you go behind the scenes and manipulate the datablock directly. bpy.ops does not know you did that. Try one way or the other.
obj = bpy.data.objects.get("Cube")
for v in obj.data.vertices:
v.select = False
obj.data.vertices.select = True
Instead of manipulating the vertex select flag directly, find a bpy.ops version of that same operation and use it instead.
Check out the Gotchas Documentation. There is a section on no updates after setting value, meshes and modes.