You could put the declaration in the .c but the array content in an include file where it can be generated (not necessarily hex) and/or versioned.
static const uint8_t reg_config[] = {
#include "config_a.csv"
};
I have seen this approach in industrial grade paid library. But it works only during build. (It's equal to opening the file with notepad and copy paste it's content before pressing build)
Since your target is to have these value runtime changeable, the only way to do it via storing them in a section in flash, and loading them to run before initializing the peripherals.
If you change the values over network, the mcu will save the new values in special section in flash and either:
A: reset
B: reinit the I2C peripherals with new values
Either way, during boot:
step_1: load from special flash section to ram structs
step_2: init I2C
Load and save to flash is whole can of worms. To store something in flash you need:
step_1: unlock flash
step_2: erase the page that you need to update (page size can be 512 byte, may be 4k bytes, depends on your mcu) (also erase = all become 0xFF)
step_3: write your data
step_4: lock flash
so you must allocate dedicated pages at the very end of the flash for storing parameters. Which is part of linker configuration.
"Very end" is not the only option, but you start going deeper in the can of worms... For first approach it's good and reliable. It allows you firmware to grow without overwriting preexisting configuration
Something that you definitely need to consider, is what will happen if the mcu reset during page erase or write and your stored data are corrupted.
There are 2 basic options, one is to load defaults (if it's acceptable) or allocate at least 2 pages at the end, and before erasing a page, create a copy of it. (Copy before update)
ex [1] [2] [3] [T]
if you need to update page 1, copy it to T(emp)
[1] [2] [3] [1]
Delete 1
[-] [2] [3] [1]
Write updated 1
[1'] [2] [3] [1]
Clear Temp
[1'] [2] [3] [T]
So at every step there is a backup of 1 before wrinting the new 1'. The only thing you need to do is then properly detect if page is corrupted and load back from the T(emp) at boot.