How is this different from just a regular imperative programming language with imperative assignment?
Causal models are just programs (with random inputs, and certain other restrictions if you want to be able to represent them as DAGs). The do() operator is just imperative assignment.
http://www.mit.edu/~maxkw/pdfs/halpern2018towards.pdf