Oi Felipe, tudo bem? Essa é uma ótima pergunta. O problema que as threads resolvem as vezes não ficam muito claras na cabeça não é? Em casos mais simples é possível sim programar sem usar threads, mas existem casos onde você não pode ou não deveria não usar threads, quer um exemplo muito prático? Interfaces!
Em aplicações android por exemplo, quando clicamos em algum botão, esse botão normalmente executa uma ação e dependendo dessa ação, ela não pode ser feita em uma thread única. Será muito comum neste caso, você ter pelo menos duas, uma para executar e responder as ações da interface e a outra para realmente executar a ação.
Digamos que você clique para baixar um disco no Spotify, esse download, caso seja feito na mesma thread da interface, você terá o aplicativo travado até o download terminar. Imagine ter que esperar o download terminar para poder ouvir as músicas. Pode funcionar sem threads? Claro, mas a experiência do usuário seria terrível. Por isso que, quando o Android detecta que você está programando esse tipo de ação, ele briga com você e diz para que a ação seja feita em uma thread separada.
O mesmo acontece para aplicações desktop e na web também de alguma forma. Pegou a ideia?