Updating a deeply nested array?

I think the problem is that you have no way to represent variables in your syntax trees.
You could add variables to your Expression type.

type Expression
    = Call CallExpression
    | Todo
    | NumberLiteral Float
    | Variable String

or, even, if you have a small number of possible variables (say, X and Y):

type Expression
    = Call CallExpression
    | Todo
    | NumberLiteral Float
    | X
    | Y

Then maintain a mapping of variables to values and use that mapping when doing computations with your trees.

In the first case (variables as strings):

type alias Mapping = Dict String Float

In the second case (just two variables X and Y):

type alias Mapping = { x: Float, y: Float}