асинхронный неблокирующий код - нужен, я и не спорю. Многопоточность-то зачем?
чтоб раз и навсегда:
асинхронный код и многопоточный код это 2 парадигмы конкуррентности.
асинхронный - более безопасный, но менее гибкий и менее производительный.
многопоточный - менее безопасный, но более гибкий и производительный.
асинхронный подход старается не блокировать основной поток, перемещая блокирующие операции в event loop. В асинхронном коде обязательно нужны Promises или async/await, иначе заблокируешь основной поток и всё вообще встанет, даже сам гуй.
в многопоточности Go же такой вид асинхронности не нужен по причине наличия горутин, в горутине можно запустить блокирующий таск совсем вез event loop'ов, callback'ов, Promise'ов и т.д. просто написать синхронный читабельный код.
единственная опастность может возникнуть если не синхронизировать доступ к памяти, которую делят меж собой несколько горутин, что в async программировании в принципе быть не может, там код выполняется в 1 потоке.
но если бы многопоточность на фронте была бы не нужна - WebWorkers никогда не появились бы. Она ещё как нужна, просто представьте:
мы запрашиваем таблицу данных с сервера и прежде чем её отобразить, её нужно преобразить, а это занимает некое время. Если писать эту трансформацию большого колва данных просто в главном потоке то вероятность велика, что гуй на 50, а может и все 500 мс зависнет и не будет откликаться. На дворе 2018 год, ни кому не нужен microstuttering и freezing на гуях. Без WebWorker'ов пришлось бы писать плагин для event loop'а для своей бизнес логики, чем естественно никто не занимается по очевидным причинам. Теперь WebWorker'ы же используются для вычислений и операций на заднем фоне взаимодействуя с главным кодом event loop'а.
Тот кто утверждает что многопоточность на фронте не нужна, скорее всего представляет себе фронт как статичную HTML'у из 90х годов, а не динамичную, анимированную, реактивную, супер сложную штуку 2018го