Да, вы можете вставлять предварительно сжатые блоки в поток zlib. Начните с примера zpipe.c в источнике zlib. Только там, где вы хотите вставить свой предварительно сжатый блок, замените Z_NO_FLUSH на Z_FULL_FLUSH (в противном случае не используйте Z_FULL_FLUSH, потому что пострадает степень сжатия.)
Теперь сжатый вывод выровнен по байту, а последний блок дефляции закрыт. Полная очистка означает, что следующий блок после предварительно сжатого блока не может содержать никаких обратных ссылок.
Добавьте ваш предварительно сжатый блок к выходному потоку (например, memcpy). Перейдите strm.next_out к следующему пустому байту. Продолжайте выкачивать, где вы остановились.
flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
ret = deflate(&strm, flush);