Object vertices coordinates are returned as an empty list occasionally
Here is a take on this.  Removed the context override on the join op, the import wavefront obj operator returns all imported objects as selected.  This is the list context.selected_objects  whereas scene.objects is all the objects in the scene.  Not sure why you would want to use context.selectable_objects for this case.

Simply deselect if not a mesh, assign first mesh obj as active (if there are mesh objs) , and then call bpy.ops.object.join().

Used bmesh for limited dissolve, takes away the need to pop modes.

Tested fine on object1.obj

import bpy
from bpy import context
scene = context.scene
import bmesh

# make a bmesh
bm = bmesh.new()
dissolve = True
filepath = "/home/batfinger/Downloads/model1.obj"

bpy.ops.import_scene.obj(filepath=filepath)

mesh_objs = []
for o in context.selected_objects:
    if not o.type == 'MESH':
        o.select = False
        print(o.name, "not a mesh")
        continue
    if dissolve:
        # use bmesh to dissolve
        bm.from_mesh(o.data)
        print("Pre dissolve", len(bm.verts))
        geom = bmesh.ops.dissolve_limit(bm, angle_limit=0.082665,
                                        verts=bm.verts,
                                        edges=bm.edges,
                                        delimit=0)
        bm.to_mesh(o.data)
        print("Post dissolve", len(o.data.vertices))
        bm.clear()
    # append the mesh object
    mesh_objs.append(o)
bm.free()
# if no mesh objs do nothing
if mesh_objs:
    scene.objects.active = mesh_objs[0]

    bpy.ops.object.join()
    # newly joined obj
    obj = scene.objects.active
    # look at verts
    verts = obj.data.vertices
    vertsx = [v.co.x for v in verts]
    vertsy = [v.co.y for v in verts]
    print(len(vertsx), len(vertsy))