Смотря какая платформа (iOS\Android и модель GPU), в принципе в устройствах с iOS видеопамять и оперативная память совмещены в один чип, потому при map\unmap получаем поинтер по которому можно спокойно писать. Можно попробовать просто сделать в лоб: два контекста, атлас между ними расшарен, первый рисует, второй обновляет его данные. Можно чуть сложнее: используя GL_APPLE_sync создать точки синхронизации когда же атлас у нас рисуется, и заливать данные только когда он не используется. Или вообще топорное решение: сделать две копии атласа, рисовать первой, заливать во вторую, потом поменять их местами.
ps. Можно текстуру которую читаешь с флешки читать через memory mapping file, это обычно дает прирост в IO и не нужно выделять временный буфер, только текстуры на флешке должны лежать в RAW формате. Подробнее я расписывал на другом
ресурсе.