Using RNA Property in Drivers?
From the advice of CoDEmanX and reading documentation, I figured out what to do last night.  I changed it all to use a pair of handler functions.  Here is the altered script:

import bpy
from bpy.app.handlers import persistent

bl_info = {
    "name": "Maelstrom Height Handler",
    "category": "Object",
}

'''
Called when the scene is updated, and calls height_general_update if
any objects in the scene have been updated.
'''
@persistent
def height_scene_update(scene):
    if(bpy.data.objects.is_updated):
        height_general_update(scene)

'''
Iterates through each scene object to see if the "height" property
is present, then adds and/or adjusts the "useHeight" property.  Does
nothing if the height is unchanged, to prevent other potential code
from running.  Runs when a scene is loaded or when called by the
above function.
'''
@persistent
def height_general_update(scene):
    didChange = False
    for obj in bpy.data.objects:
        rigChanged = False
        if("height" in obj.keys()):
            val = int(obj.proxy != None)
            if("useHeight" not in obj.keys()):
                obj["useHeight"] = val
                rigChanged = True
            else:
                if(obj["useHeight"] != val):
                    obj["useHeight"] = val
                    rigChanged = True
        if(rigChanged):
            print("Adjusting useHeight flag of", obj.name)
            didChange = True

def register():
    bpy.app.handlers.scene_update_pre.append(height_scene_update)
    bpy.app.handlers.load_post.append(height_general_update)

def unregister():
    for idx, val in enumerate(bpy.app.handlers.scene_update_pre):
        if(val == height_scene_update):
            del bpy.app.handlers.scene_update_pre[idx]
    for idx, val in enumerate(bpy.app.handlers.load_post):
        if(val == height_general_update):
            del bpy.app.handlers.load_post[idx]


if __name__ == "__main__":
    register()