I frequently see this pattern in code, binding shared_from_this as the first parameter to a member function and dispatching the result using an async_*
There is no conversion from boost::shared_ptr (the return type of shared_from_this) to Connection* (the type of this), as it would be unsafe as you rightfully pointed out.
The magic is in Boost.Bind. To put it simply, in a call of the form bind(f, a, b, c) (no placeholder or nested bind expression involved for this example) where f is a pointer to member, then calling the result of the call will result in a call of the form (a.*f)(b, c) if a has a type derived from the class type of the pointer to member (or type boost::reference_wrapper), or else it's of the form ((*a).*f)(b, c). This works with pointers and smart pointers alike. (I'm actually working from memory the rules for std::bind, Boost.Bind is not exactly identical but both are in the same spirit.)
Furthermore, the result of shared_from_this() is stored in the result of the call to bind, ensuring that there are no lifetime issues.