I don't think it is going to be possible to extend hx::object in your own code.
So really you must wrap your c++ object in a dynamic to pass to haxe, or use a native function pointer for the callback.
Wrapping is usually done with "alloc_abstract". It may also be possible to do this with cpp::Struct, but it involves closer mixing of c++ and hxcpp code.
There is nothing really wrong with wrapping as an abstract. If you are worried about allocation count, you can allocate the abstract once, and recycle it (don't forget AutoGC) When you receive this in your callback, assign it to a cpp.Pointer<YourType> and you should have direct access to the data.
This is exactly how events are passed in nme in cpp.
Using a native callback would involve making a static function in haxe and using Function.addressOf to pass this to some native code (you would need to resolve the symbol somehow).