Препроцессор - тупой зверь. Он работает на чисто текстовом уровне, независимо от того, что он делает с кодом семантически. Давайте посмотрим, что он делает в этом случае:
a = XXX * 10;
становится
a = ABC - XYZ * 10;
, который становится
a = 20 - 10 * 10;
что, очевидно, -80
.
Что, вероятно, предполагалось, было
#define XXX (ABC - XYZ)
Это одна из причин, по которой макросы считаются злыми.