Правильно будет использовать std::vector, например так std::vector<int> v(N*M);
Но стоит учитывать, что для большого числа данных памяти может не хватить.
Судя по ошибкам - у вас проблемы с оперативной памятью. Попробуйте заменить планку, если она не распаяна.
Также можно потестировать память через программу memtest86.
Подскажите пожалуйста, можно ли каким-то способом обезопасить обращения к QJSEngine из других потоков?
Можно через систему сигнал/слот передавать информацию в поток, в котором создан объект QJSEngine и там выполнять QJSEngine ::call. Используйте флаг Qt::QueuedConnection для подключения слотов к нужному вам сигналу.