I have mixed feelings about this.
First, there are some backwards compatibility concerns. Since #set( $!foo = 2 ) always worked (though the bang was meaningless), this could break things for people who unwittingly use(d) that syntax already. That's not a showstopper, as they had no good reason to do so, but we would have to make sure to highlight such a change in the changelog, log a debug message each time, and perhaps even make this configurable.
Second, it feels odd to me that #set( $!foo = 2 ) should work, but not #set( $!foo.bar = 2 ). Your comments in the patch simply say "it makes no sense", but why not? It seems like it's more a matter of being tricky to implement the check for the value. I think if we were to do this, it would be best to be as consistent about it as possible.
Anyone else have thoughts about this?