bpy.ops.object.location_clear() Does not clear locations for keyframe'd objects
Thanks to zeffii on the #blenderpython IRC channel on freenode I've got this sorted out. The issue is that the keyframes take precedence over the plain matrix_world so clearing it has no effect from the script. The solution is to mute the animation before clearing the transform, then un-mute it to restore the animation to how it was previously.

So the final script ends up basically like this:

# Select all the objects we want to export and save
# their matrix_world so we can restore it after exporting
# If the object is animated also mute keyframe animation so
# it doesn't block *_clear
for curve in obj.animation_data.action.fcurves:
    curve.mute = True

# Clear positions for exporting everything at its identity transform
bpy.ops.object.location_clear()
bpy.ops.object.rotation_clear()
bpy.ops.object.scale_clear()

# Export meshes to OBJ
bpy.ops.export_scene.obj(...)

# Restore transformations by setting matrix_world back to what we saved earlier
# If the object is animated also unmute keyframe animation to restore it
for curve in obj.animation_data.action.fcurves:
    curve.mute = False