Uma olhada nas páginas man
nos diz:
The -g option forces variables to be created or modified at the
global scope, even when **declare** is executed in a shell function.
Assim, se o seu script disser:
my_eval "declare -gA ASSOC"
você / você seria mais feliz.
O ponto é que a instrução "declare" vê seu escopo no local em que é executada / avaliada e não no local onde está escrita.