Q) Are you able to continue working while you serialize and free or does the app have to wait for this operation to complete?
One thought would be to take Andy's idea and apply a log/pool rotation model to keep the IOs flowing. Using 3 memory pools, one would be the active pool that your app writes to, one would be in an immutable state while you serialize the data to disk and perform compaction if necessary (then it gets destroyed and recreated - or freed), and the other is a brand new, or previously freed pool ready to take writes when the active pool gets full. You could then assign different threads or processes to handle these activities. Switching between pools would be very quick.
For a single pool implementation, a potential approach would be to define a low-water and high-water mark (how full the pool is before you take action). If you reach the low-water mark, you can kick off the serialization thread to start writing data out to disk and freeing the objects when the write is complete. You can choose any number of well-known algorithms - FIFO, LRU, etc to decide which objects are written and removed. If the ingestion of data into the pmem pool exceeds how fast you can write out to the SSD/HDD you'd hit the high-water mark which would either use a more aggressive serialization approach or queue the ingestion until you get caught up.
Just thought I'd share some ideas as I can imagine the current freeing approach can take several seconds to complete with large pools.