I'm facing the exact same problem that you described in your edited post. \glsdesc seems to break nested \gls. Hope that someone knows a workaround or how to fix it.
–
christophSep 19 '12 at 18:59

@christoph: The effect you observe is due to the special ‘sanitization’ applied to the values of the name, description and symbol keys. Hence, try \usepackage[sanitize=none]{glossaries} and then \glsdesc*{foo}. Note that, without sanitization, you have to protect fragile commands in the arguments of \newglossaryentry. But fortunately, \gls is robust.
–
mhpSep 20 '12 at 19:55

The first part of the above question has already been correctly answered by @bloodworks. So I’m only addressing the second part, as in my original comment.

The situation is the following: To ease the usage of fragile commands in glossary definitions, the glossaries package ‘sanitizes’ the values of the name, description and symbol keys using the LaTeX 2ε kernel command \@onelevel@sanitize. As a result, each of these values is replaced with a character string preserving the respective unexpanded meaning.

Obviously, this procedure is convenient when it comes to writing the values of the name, description and symbol keys to the output glossary file (i.e. the auxiliary file with the filename extension .gls). On the other hand, it possibly fails when one of these values is typeset directly via \glsname, \glsdesc or \glssymbol.

In a nutshell, if you want to reference glossary entries using \glsname, \glsdesc or \glssymbol you might consider completely turning off the sanitization procedure. To this end, load the glossaries package as

\usepackage[sanitize=none]{glossaries}

Alternatively, you can disable the sanitization procedure only for a subset of the three affected keys. Try, for instance,

\usepackage[sanitize={description=false}]{glossaries}

Of course, turning off the sanitization procedure possibly requires adaptations to existing glossary definitions: Fragile commands have to be protected (e.g. by prefixing them with \protect from the LaTeX 2ε kernel) or made robust prior to usage (e.g. by means of \robustify from the etoolbox package).