Асинхронность - это когда в коде есть точки, где язык, если надо, переключится на другую задачу, если можно, например идет долгая IO операция. А как сможет - вернется в ту точку, откуда переключился. И всё это может быть в рамках одного потока.
Поток - это поток, их у ОС конечное количество. Разные потоки могут выполняться как на разных ядрах, так и на одном.