I was thinking about that however I am not aware of a straightforward way how individual parameters could be updated by the application. The script would be frozen anyway.
I was also thinking to move all parameters to NVS however the config also contains few strings which are not directly supported by the NVS right now.
I think that the best solution will be to put default parameter values into Python script which will be frozen during build process. After boot it will be tested if NVS contains "init" flag and if not an initialization method will be called. Within this method individual parameters will be loaded from Python script to a dictionary which will then be dumped into json file stored in the internal file system. This will happen only during first boot after last firmware flashing.
You can get a list of files with uos.listdir(<dir>). If you tell the version by the modification data, uos.stat() tells you the file modification time, given that the clock was set appropriately, and machine.reset() can be called to reset the device.
If you do not have RTC supplied by a battery, you can set the time via ntp by:
from machine import RTC
Then, the file modification times are valid.
If you use another mechanism as version indicator, like the name of a file or the content of a file, you have to define and implement it yourself.