1)
[i for i in bm.verts if i[my_id]]
This will work because any int value other than 0 will return True. Therefore there's an assumption that you aren't using the value 0 for anything meaningful.
2)
Custom id data is removed after bm.free(). I don't know if it can be wiped before.
for the sake of completeness
>>> import bmesh
>>> bm = bmesh.new()
>>> obj = bpy.context.active_object
>>> bm.from_mesh(obj.data)
>>> my_id = bm.verts.layers.int.new('id')
>>> bm.verts.ensure_lookup_table()
>>> bm.verts[0][my_id]
0
This shows that even before you assign a specific value to your layer.int for that vertex, it will already have a default 0.
-1or something as a token. The documentation is quite sparse and doesn't mention removal as far as I've been able to find. – zeffii Jun 02 '15 at 19:54