Луашные объекты (даже просто таблично-метатабличная фигня а не cdata) — очень сложна даже в копировании. А между стейтами их нужно именно что копировать, потому что стейт держит его в себе и никуда не отдаёт.
Так что давай просто строчки кидай в shared-memory.
А preemptive multitasking — делай средствами самих луа с корутинами. Это не сложно. Для этого не нужны тяжёлые потоки и разные стейты. Внутри одного стейта получишь свою мультитаску, по приёму строчек из сокета/шаред-мемори.
Примерно так же работает, например, openal: есть поток со звуком, который всё микширует, а другие потоки в приложении шлют ему: "хочу проиграть вот это и вот это".
Файберы — аналог корутин. Все файберы выполняются в одном настоящем потоке. Или там нагромоздили извращений. А ещё, я не уверен что там можно шарить объекты.