A variant of your second last option (priority to specific configuration properties): why not add a very simple event bus, whereby if a property is allowed to change dynamically, those components that want to be informed about the change have to register for a callback if it changes? (Basically cache invalidation.)
I think that the number of options that should be dynamically reconfigurable is much less than the number of configuration options we have or are likely to ever have. So optimising for that approach would get my vote. And your last suggestion, of delaying the freeze point, may well be sufficient to do that too.