Извините, что отвечаю сам, но только для того, чтобы подтвердить, что на вопрос дан ответ: согласно https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.5/a00879_source.html действительно деструктор общего состояния блокирует не само будущее.
template<typename _Res>
class __future_base::_Async_state : public __future_base::_State
{
public:
typedef _Res _Res_type;
explicit
_Async_state(std::function<_Res()>&& __fn)
: _M_result(new _Result<_Res>()), _M_fn(std::move(__fn)),
_M_thread(mem_fn(&_Async_state::_M_do_run), this)
{ }
~_Async_state() { _M_thread.join(); }
И будущее, возвращаемое из асинхронного режима, использует именно этот тип состояния.Такое же поведение может быть достигнуто путем создания класса, деструктор которого присоединится к () в каком-либо потоке, и создания будущего с этим классом в качестве параметра шаблона: https://ideone.com/5RAPoA