Daniel is right, the memory should be eventually freed when ALL the child processes update their local configuration, i.e. do at least one iteration of their loop and call cfg_update(). Each child process updates its local cfg pointer to the global one and travels through the pending callback list. Every item of this list can have a set of memory address to free. The last child that processes the change frees the memory. Check cfg_update_local with the loop: while (cfg_child_cb != last_cb) {...} cfg_child_cb_free_item() frees the "replaced" strings.
The restriction is that none of the processes should be idle for a very long time. They should at least update the local config from time to time. This may not be always the case.