I store cache of pre-processed assets in "hidden" subdirectory.
Also there's sqlite db file in that dir, storing source file hashes and additional attributes.
When pack is rebuilt, for every added file I calculate hash and check if there's cached blob with that hash.
If there's such file in cache - it will be added to pack as is. If there's no file in cache, then asset will be pre-processed, compressed and cached.
In that way pack is rebuilt very quickly, as only changed resources will be actually processed.
And there's neat side effect - multiple identical assets will refer to same blob in pack.
Thank you very much, your answer was very helpful.