LuaBridge makes a copy of your argument. If you define a copy constructor yourself and put a breakpoint there, you'll jump from
/**
Push T via copy construction from U.
*/
template <class U>
static inline void push (lua_State* const L, U const& u)
This is just a contract of passing parameters in LuaBridge. I guess, it is so, since the datum has the C++ managed lifetime, and this is a safety feature. You can rewrite your datum with a new value, and you'll get what you want:
Core.t1.d = 12
t2 = Core.Test(10)
t2.d=12
print(Core.t1.d)
print(t2.d)
Core.t1 = t2
print(Core.t1.d)
outputting
10
12
12
and your C++ - side t1 will have the d value of 12