I see your reason for supporting approach 3, but it seems an
unusual restriction to set (perhaps I'm uninformed). However, if
the behavior is atypical, then it sort of presents a usability
issue.
Is it that approach two is too complex or costly? I'm by no means a
Ruby expert, but bear with me...

Because the Flag type contains multiple values, and is
represented as an array, it seems logical that I can push things
into it. One of the reasons I appreciate DataMapper is that it does
feel like "All Ruby All The Time", and things work naturally. I
think this is especially important if #1128's
conclusion was that Flag should yield arrays.

I don't think your example is atypical at all; consider the
following case with calling capitalize! on a string
attribute: http://gist.github.com/276969

Receiver modifying methods seem to be a weakness with the
current implementation of dirty tracking. ActiveRecord addresses
this by requiring you to call
#{attribute}_will_change! before modifying the
receiver.