Yes, it is a bit complicated. If you need it a lot, you can load the following definitions in your initialization code:
Unprotect[Equal];
Equal /: Equal[a_, b_] + Equal[c_, d_] := Equal[a + c, b + d];
Equal /: a_?NumericQ*Equal[c_, d_] := Equal[a*c, a*d];
Protect[Equal];
After that, you can simply type
(a == b) - 2 (c == d)
and get a - 2 c == b - 2 d
as desired.
I think Wolfram should provide this behaviour as default, if there is no serious reason not to do it.