Funny, I always assumed it was (k)ey (and (v)alue). Good thing that both ksh and key start with the same letter :-)
I suppose, rather than introduce (!), I
could have extended (k) for the named reference behavior, to preserve
that similarity. Could still try that if it seems a good idea.
No, I don't think this would be wise. Zsh's (!) and ksh's ! really do two different things.
Zsh's (!) means don't dereference the parameter and use its value as is. For references, it implies using the referent name. For other types of parameters it has no effect. Afaik, there is no equivalent mechanism in ksh, which ALWAYS fully dereferences the parameter.
Ksh's ! means return the name of the referred variable instead of its value, or, if there are multiple elements, print the names/keys/indexes of the referred elements instead of their values. The latter part matches what Ksh's (k) performs for associative tables.
Even though Zsh's (!) and ksh's ! perform two fundamentally different things, there is one case where they produce the same result. Consider the following definitions:
typeset -a var0=(abc def ghi)
typeset -n ref1=var0
In Zsh, the (!) in ${(!)ref1} means don't dereference ref1 and use its value as is, so the substitution returns the string "var0". In ksh, the ! in ${!ref1} means return the name of the variable referred by ref1, which is the name of the variable var0, so, like in Zsh, the string "var0". This equality of results is however limited to direct variable references with no subscripts. In Zsh, ${(!)var0} and ${(!)ref2} respectively return "abc def ghi" and "ref1", while in ksh ${!var0} and ${!ref2} both return "var0" and in Zsh ${(!)ref1[1]} returns "v" while in ksh ${!ref1[1]} returns "var0[1]".
This shows that even though Zsh's (!) and ksh's ! use the same character flag and sometimes happen to return the same value, they really should not be considered as being related; they perform two fundamentally different things.