Seu multithreading está perfeitamente bem, mas o código que é executado não é o que você espera.
Tente executar este código
def boom1():
print(5**10000000000)
if __name__=="__main__":
print('Done')
Sim, a função boom1 não é chamada, mas você verá que 1 thread ainda tenta fazer "alguma coisa" e leva uma eternidade. Na verdade, esse "algo" é ConstantExpressionEvaluator - ele tenta pré-computar expressões constantes por motivos de desempenho, mas sua constante é tão grande que leva o tempo todo para ser concluído. Para quebrar essa otimização single-threaded e executar o código em paralelo, basta adicionar este passo extra aos seus cálculos.
Algo parecido com isto
def boom1():
z = 5 ** 10
z = z ** 1000000000
print(z)