Вроде как я разобрался, в литературе Энтони Уильямса when_any (из experimental std) работает ровно как я описал выше, то есть когда будет готов хотя бы 1 фьючерс он вернет вектор фьючерсов в отсортированном виде так, чтобы сначала шли готовые (то есть begin должен быть 100% is_ready), в бустовой же версии готовый фьючерс будет лежать на своем месте, а не в начале.
И доставать его нужно как-то так:
...(boost::future<std::vector<boost::future<std::string>>> result_args) {
auto results = result_args.get();
auto any_res = results.begin();
for (; any_res != results.end(); any_res++){
if (any_res->is_ready())
break;
}
...