I think I found part of an explanation.
If a function f has the "Flat" attribute like in my example, Mathematica not only checks f[a,b] but also f[f[a],f[b]], f[a,f[b]]... Now it seems a question in which order these test are done.
If the definition: f[a, b] := a + b; is given before SetAttributes[f, Flat]; it looks like the definition is used before Flat goes to work. In the other case, the function head is first wrapped around the arguments and then tested.
There is also another player, namely the Attribute "OneIdentity". If this attribute is specified together with "Flat", it looks like all nested function applications are removed before testing (the thing I would have assumed at first).
All of this looks a bit foggy, if anybody has a concise explanation, I would be most grateful.