Difficult to say if it is a bug or not. It looks like it is, but without a solid preprocessor specification to compare against, I can't say with certainty.
Given this:
#define EXTRACTBRCKTELMNT(Terminator, Elmnt) #Elmnt, #Terminator
#define GETBRCKTELMNT(ToExtract) GETELMNTEXPAND(EXTRACTBRCKTELMNT##ToExtract)
#define GETELMNTEXPAND(a) GETELMNTEXPAND2 (a)
#define GETELMNTEXPAND2(a, b) a, b
let's see a manual expansion:
GETBRCKTELMNT((YYY, XXX))
becomes (expanding GETBRCKTELMNT)
GETELMNTEXPAND(EXTRACTBRCKTELMNT##(YYY, XXX))
becomes (and this is presumably the step it doesnt like)
GETELMNTEXPAND(EXTRACTBRCKTELMNT(YYY, XXX))
becomes (expanding EXTRACTBRCKTELMNT)
GETELMNTEXPAND("YYY", "XXX")
becomes
GETELMNTEXPAND2("YYY", "XXX")
becomes
"YYY", "XXX"
...