Ваш вопрос настолько топорно составлен, что даже непонятно как вообще отвечать.
1. Передачу объекта из одной среды в другую не обязательно решать блокировкой (lock) именно того объекта, что существует в "мире" lua.
2. Даже если блокировать lua-объект, почему вы собрались это делать shared_ptr-ом?? Он как-то шарит владение с менеджером памяти lua? Не слышал о такой возможности. Т.е. я не думаю что
Проблема решается через shared_ptr
3. Зачем всё переписывать на использование shared_ptr?? вы хотите начать писать на плюсах как на lua? даже если бы ваши предположения в п.1 и п.2 магическим образом оказались верны, shared_ptr и сборка мусора - сильно разные вещи, не разобравшись ни в одной из них до конца, вы посчитали что это одно и то же потому что оно "похоже".
4.
ведь производительность упадет
не упадёт, точнее вы этого не узнаете т.к. ничего нормального по такой стратегии не напишете.
Пишу игру на c++ и lua.
Вы вообще писали на C++ или сразу пишете на "C++ и Lua"?
можно ли использовать shared_ptr в играх
Можно, в тех местах где это целесообразно. Не думаю что игры сильно отличаются в этом вопросе от других C++ проектов.
и есть ли какие то другие решения передачи объектов между lua и c++?
А что говорить документация используемого вами интерпретатора lua?