Проблема в том, что std::async не справляется (и фундаментально не может справляться) со своей задачей — предоставить task-based параллелизм. Подробнее см. [1]
Если верить Eli Bendersky [2], из-за указанных в [1] проблем (и не только) std::async почти пометили бумажкой «deprecated» в 17-м стандарте, но в последний момент решили подставить кастыль в виде [3], только ради того, чтобы сохранить лицо комитета стандартизации: шутка ли — в 11-м году принять фичу в стандарт, а уже в следующей редакции (14-я была минорной, не забывайте) пометить deprecated. Это поставит под сомнение адекватность и легитимность комитета.
Вот так всегда в C++: впопыхах напихали нерабочих фич в стандарт — потом подпирают кастылями.
[1] https://bartoszmilewski.com/2011/10/10/async-tasks-in-c11-not-quite-there-yet/
[2] http://eli.thegreenplace.net/2016/the-promises-and-challenges-of-stdasync-tas...
[3] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3773.pdf
P.S. Лучше бы его и правда пометили deprecated.