Una respuesta simplificada es: cuando ve un nombre en un lenguaje puramente funcional, sabe cuál es el valor asociado mediante una simple búsqueda de su definición. Si tiene variables mutables, solo puede determinar por cuál de las varias asignaciones se ejecutó por última vez, por lo que también debe analizar el flujo de control, que a su vez puede ser condicional, dejándolo con múltiples posibilidades. Para obtener una explosión exponencial, solo debe tener en cuenta que el RHS de las asignaciones dependen de las variables, por lo que también debe analizarlas de forma recursiva.
La conclusión en el análisis anterior es que es insostenible sin comentarios que expliquen la intención, los invariantes y la semántica: estos pueden ser difíciles de interpretar y puede ser difícil verificar que la semántica se cumpla en el código real.
Esta respuesta es básicamente una expansión del punto 1 de @ Javier.
Creo que también es una explicación de la popularidad del régimen fraudulento de OO: con OO, el estado mutable se encapsula, lo que facilita mucho el análisis al localizar las mutaciones hasta cierto punto, y permite una expresión y verificación de la semántica mucho más robusta.
Habiendo notado eso, la programación funcional no es la respuesta. La respuesta correcta es un sistema que admite programación inductiva (funcional) y coinductiva (de procedimiento), por lo que las herramientas adecuadas pueden manejar tanto la programación sin estado como la de estado. Es solo que la teoría constructiva (funcional) está bien establecida, mientras que la teoría de la gestión estatal todavía está en pañales.