The problem is not specific to dollar signs: the problem is that expr won't accept a name (for the array in this case) that starts with a number, or that contains an aritmetical operation sign. Which, besides not allowing for names that are legal in Pd, seems like an error in the parsing process, because it seems it applies the same rules inside quotation marks that it would apply without quotes.
I think the best thing is to tell [expr] to expect a symbol in its first inlet (the name of the array), and then create the symbol by other means. This more in keeping with the normal usage of [expr] and friends anyway, I think.
[symbol $0-foo] | [expr size("$s1")]
has always worked for me.
Matt