To update this for anyone else having the same problem, I opened a support call and have come up with the following workaround with their advice. Instead of setting the parameter to the value of the variable, I now use assignin to put the variable in the base workspace, and then set the parameter to the name of the variable. Something like this:
>> load('saved_params.mat');
>> assignin('base', 'saved_param', saved_param);
>> set_param('untitled/Gain','Gain','saved_param')
This works correctly and sorts the problem (although it could lead to a very messy base workspace - but that's another problem!)