Custom scene properties mysteriously resetting
If you use the operator panel in the toolbar with register, changing a value in the panel will undo the changes made by the last call of the operator's execute method (including the change made to the scene's custom property which causes the update procedure and then gets reset to its previous value when the undo is performed) and run the method again with the new parameters given.

You could simply use another string property for the operator and assign it's value to scene.photoPath in the operator's execute method.

import bpy

class add_mesh_point_cloud(bpy.types.Operator):
    bl_idname = "mesh.point_cloud_add"
    bl_label = "Add Point Cloud"
    bl_options = {'REGISTER', 'UNDO'}
    bl_description = "Generate a point cloud from photographs"

    photoPath = bpy.props.StringProperty(
                    name="Path to photos",
                    description="Path to the folder containing the JPG photos"
                    )

    def execute(self, context):
        context.scene.photoPath = self.photoPath
        return {'FINISHED'}

    def invoke(self, context, event):
        self.photoPath = context.scene.photoPath
        return self.execute(context)

    def draw(self, context):
        layout = self.layout
        layout.prop(self, "photoPath")

if __name__ == "__main__":
    bpy.utils.register_class(add_mesh_point_cloud)
    bpy.types.Scene.photoPath = bpy.props.StringProperty(
                                    default = "LoremIpsum"
                                    )