the variable evaluates, but the shell fails to construct the tree using the list held in the variable.
Right, that's due to the order of evaluation. Brace expansion before
variable expansion... which means this works:
mkdir {$a,$b,$c}/{$d,$e,$f}
no matter what $a, $b, $c, $d, $e, and $f contain, even if it's braces.
You have a couple options. One is "eval" - the problem with eval is
that it re-evaluates everything, including some things you might not
want, and spaces, commas, quotation marks, etc will confuse the heck
out of it.
Another option would be to use a loop. Of course, the downside here
is that you wind up executing mkdir multiple times instead of just
once with a huge argument list.
tops=(list of sub folders)
subs=(sub sub folders)
for top in "${tops[@]}"; do
for sub in "${subs[@]}"; do
mkdir -pv "$top"/"$sub"
done
done