Сразу оговорюсь, могу ошибаться, я boost asio не использовал
С синхронным всё верно. При этом клиенты обрабатываются по очереди.
С асинхронным иначе.
1. В конструкторе tcp_server зовётся start_accept, который зовёт async_accept и возвращается управление обратно.
2. Затем зовется io_service.run(), судя по всему, где-то внутри он-таки принимает подключение и вызывает handle_accept, который был забинжен при start_accept и пункта 1.
3. handle_accept зовёт start, который зовёт async_write, т.е. не дожидается отправки данных, а опять же сразу возвращает управление. По окончании отправки вызовется handle_write
4. затем снова start_accept -> async_accept и возврат
Т.е. в синхронном случае второй клиент не подключится, пока первому полностью не ответят
В асинхронном случае вызывается async_write, и до окончания ответа первому клиенту, в принципе может уже подключиться второй.
Вообще асинхронный способ для того и нужен, чтобы, приняв соединение клиента, сразу начинать принимать следующего, а с первым клиентом работать уже отдельно.