The only way to get new values into a running Synth is using a Control input. Controls are automatically created from arguments of the SynthDef function.
The code you posted looks of the value of d.at("name")
once when building the SynthDef. After that, it's hard coded and can't be changed (without rebuilding the SynthDef).
I'd suggest, keep the dictionary on the client side and send the new value as needed using .set --
d = Dictionary.new;
d.put("cfreq", 90);
(SynthDef("name", { |cfreq = 440|
var instr;
instr = SinOsc.ar(freq);
Out.ar(0, instr);
}).send(s)
)
y = Synth("name", [\cfreq, d.at("cfreq")]);
d["cfreq"] = 900;
y.set("cfreq", d["cfreq"]);
hjh