I think I do not understand yet.
a += 1
is not the same as
it is the same as
a = a.plus(1)
so if a is final, the assignment will fail, but not the plus. In the case above Foobar.blah.plus ( 2 ) means to create a new list with the additional item 2 and assign the new list to the old one. The list stored in blah, but not final, so no exception. Foobar.blah += 1, is the same with two differences, the "2" is a "1" now and in the end I am assigning a new value to blah. Since blah is a final field, the VM will throw the runtime message. There is nothing wrong with that.
The only thing Groovy in combination with the VM ignores here is the final modifier to local variables. Yes, for this we could write a compile time test and throw a compile time error.