Here is another way.
SetAttributes[set,HoldFirst]
set[symb_[idx__][[part__]],var_]:=Module[{x=symb[idx]},
x[[part]]=var;
symb[idx]=x
]
use[symb_]:=Module[{},
Unprotect[Part];
Set[symb[idx__][[part__]], vv_] ^:= set[symb[idx][[part]],vv];
Protect[Part];
]
testing with:
use[a]
a[x] = {1, 2, 3}
a[x][[2]] = 7
we get, as in @Mr.Wizard test:
> {1, 7, 3}
I like the fact that this solution keep the Downvalues in a, instead of a random named Global variable x.
I don't like to `Unprotect` `Part`, but in this case doesn't seem to be bad.