If b is a lexical variable, eval won't help, since it isn't run in the lexical scope in which it's called. An Arc lexical variable will get compiled to an MzScheme lexical variable, and I don't know of a way to refer to an MzScheme lexical variable by name determined at run time. If there isn't, I suspect your only hope might be to modify the Arc compiler to generate code like
((a) (set! a n))
((b) (set! b n))
((c) (set! c n))
((d) (set! d n))
for all the lexical variables available at that point.