It's not wrong to want that. But it is for important safety reasons that BOOST_FOREACH treats copies of containers as const. In some of the examples you've shown so far, you're trying to proxy a temporary object so you can modify it. That's never going to work. Like this:
for (xxx::iterator it(GetVector().begin(), end(GetVector().end()); it != end; ++it) { modify(*it); }
That's not even valid C++. But even if it were and GetVector() returns a temporary object or a proxy to a temporary object, the vector will be destroyed before you can iterate it. The interface I chose preserves object lifetimes and prevents inadvertent mutation of temporary objects. Weakening its guarantees is a bad idea.
Eric, thanks for detail explanation! The several tradeoffs you met, I think you choose the right solution.