The manual would tell you that Brace expansion is performed before any other expansions ...
I don't think that you have any option but to use eval
here if you want to make use of variables in the command:
SOURCE='/foo';
FILES='{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}';
FILELIST="$(eval echo "${SOURCE}"/"${FILES}")"
and later say:
scp -r "$FILELIST" $DESTINATION