Duplicating object and default value of property
Each property can have callback functions: update(), set(), get() and get(), set() callback functions allows force to use default value:

import bpy

values = {}

def cb_get(self):
    try:
        value = values[self.name]
    except KeyError:
        value = -1 # default value
    return value

def cb_set(self, value):
    values[self.name] = value
    return None

bpy.types.Object.my_prop = bpy.props.IntProperty(name="MyProp",
    description="My Property",
    get=cb_get,
    set=cb_set
    )

print(bpy.context.active_object.my_prop)
bpy.context.active_object.my_prop = 10
print(bpy.context.active_object.my_prop)


Example with more explanation can be found in this gist:

https://gist.github.com/jirihnidek/2e5218dd8bf06787e538

Edit: Reloading blend file using previous concept is risky (look at comments). Following solution tries to fix problems with reloading blend file.
    import bpy

def cb_get(self):
    if self.name != self.name_:
        self.name_ = self.name
        self.my_prop_ = -1 # default value
    return self.my_prop_

def cb_set(self, value):
    self.my_prop_ = value
    return None

bpy.types.Object.my_prop_ = bpy.props.IntProperty(name="MySecretProp",
    default=-1,
    description="My Secret Property",
    options={'HIDDEN'}
    )

bpy.types.Object.name_ = bpy.props.StringProperty(name="SecretName",
    default="",
    description="Expected name of object storing properties",
    options={'HIDDEN'}
    )

bpy.types.Object.my_prop = bpy.props.IntProperty(name="MyProp",
    description="My Property",
    update=cb_update,
    get=cb_get,
    set=cb_set
    )

print(bpy.context.active_object.my_prop)
bpy.context.active_object.my_prop = 10
print(bpy.context.active_object.my_prop)