Admittedly the (flip ($)) operator is much more basic than lenses and deserves some scrutiny. Chaining many operations "foo $ bar $ baz bag" reads "the wrong way"; one has to maintain a mental stack of the operations to figure out what's going on. OTOH, "bag & baz & bar & foo" reads "the right way". "Take bag, and then apply baz, and then apply bar, and then apply foo". Sort of like a UNIX pipeline.
I think (&) is worthy of inclusion in Prelude :-) That aside, in the context of lenses, (record & foo .~ value) is even more essential than the above general case. This is also the order that Structured/OO-style code is written (record.foo = value, in C/Ruby/Python/C++/Java/...) - for a good reason. The short of it is that IMVHO, it does meet the high bar of a universal single-character operator. I certainly use it a lot in my code.
As a side note, it would have been awesome if we could have used (:) ("record : field :~ value", and the truly elegant state-monad "field := value"). Alas, "everybody wants the (:)" - in Haskell it is used for cons, and any operator starting with ":" must be a type operator, so this is out of the question.
(&) seems like the best of the viable options, given (%) was snatched by Data.Ratio. I still prefer (%) better, but I can live with (&).
Oren.