Uma resposta simplificada é: quando você vê um nome em uma linguagem puramente funcional, sabe qual é o valor associado com uma simples pesquisa de sua definição. Se você tiver variáveis mutáveis, poderá saber apenas por qual das várias atribuições foi executada por último, para analisar também o fluxo de controle, que por sua vez pode ser condicional, deixando-o com várias possibilidades. Para obter uma explosão exponencial, você só precisa considerar que o RHS das atribuições é dependente de variáveis; portanto, é necessário analisá-las recursivamente também.
O ponto principal da análise acima é que é insustentável sem comentários explicando a intenção, os invariantes e a semântica: pode ser difícil de interpretar e pode ser difícil verificar se a semântica é respeitada no código real.
Essa resposta é basicamente uma expansão do ponto 1 de @ Javier.
Penso que é também uma explicação da popularidade do regime fraudulento de OO: com OO, o estado mutável é encapsulado, o que facilita muito a análise, localizando as mutações em certa medida e permitindo uma expressão muito mais robusta e verificação da semântica.
Tendo observado isso, a programação funcional não é a resposta. A resposta certa é um sistema que suporta programação indutiva (funcional) e coindutiva (processual), para que as ferramentas certas possam lidar com programação sem estado e com estado. Só que a teoria construtiva (funcional) está bem estabelecida, enquanto a teoria da gestão do estado ainda está em sua infância.