cons is not purely functional since set-car! and set-cdr! have existed just as long as cons had.
Saying that cons is functional as long as you don't modify the result later is like saying that variable assignment in C is functional.
There are lisp dialects that have immutable cons: https://docs.racket-lang.org/reference/pairs.html