It seems like BMesh integration is breaking a lot of scripts, including the obj importer with UVs. In this case the problem is that Mesh.uv_textures.new() used to return a MeshTextureFaceLayer, but now returns a MeshTexturePolyLayer instead. The collection of MeshTextureFaceLayer is now called Mesh.tessface_uv_textures instead. It is actually straightforward to get the corresponding facelayer from the polylayer:
uvtex = mesh.uv_textures.new()
uvtex.active = True
tessUvtex = mesh.tessface_uv_textures.active
One can set uv coordinates of a tesselated face, like this:
tessUvtex.data[0].uv1 = (0.3,0.4)
Unfortunately, this does not affect the UVs in the viewport.
To figure out what is going on, I made a little experiment with the default cube in Blender 2.62.0 r44464. It has no faces, but it has polygons.
>>> me = bpy.context.object.data
>>> me
bpy.data.meshes['Cube']
>>> list(me.vertices)
[bpy.data.meshes['Cube'].vertices[0], bpy.data.meshes['Cube'].vertices[1], bpy.data.meshes['Cube'].vertices[2], bpy.data.meshes['Cube'].vertices[3], bpy.data.meshes['Cube'].vertices[4], bpy.data.meshes['Cube'].vertices[5], bpy.data.meshes['Cube'].vertices[6], bpy.data.meshes['Cube'].vertices[7]]
>>> list(me.edges)
[bpy.data.meshes['Cube'].edges[0], bpy.data.meshes['Cube'].edges[1], bpy.data.meshes['Cube'].edges[2], bpy.data.meshes['Cube'].edges[3], bpy.data.meshes['Cube'].edges[4], bpy.data.meshes['Cube'].edges[5], bpy.data.meshes['Cube'].edges[6], bpy.data.meshes['Cube'].edges[7], bpy.data.meshes['Cube'].edges[8], bpy.data.meshes['Cube'].edges[9], bpy.data.meshes['Cube'].edges[10], bpy.data.meshes['Cube'].edges[11]]
>>> list(me.faces)
[]
>>> list(me.polygons)
[bpy.data.meshes['Cube'].polygons[0], bpy.data.meshes['Cube'].polygons[1], bpy.data.meshes['Cube'].polygons[2], bpy.data.meshes['Cube'].polygons[3], bpy.data.meshes['Cube'].polygons[4], bpy.data.meshes['Cube'].polygons[5]]
>>> p = me.polygons[0]
>>> list(p.vertices)
[0, 1, 2, 3]