Как вы заметили, проблема в том, что x/x
сразу оценивается в 1, поэтому последующая замена x на 0 в действительности не происходит.
Чтобы избежать оценки, нужно передать оценку = ложный флаг произведению х с 1 / x:
>>> expr = Mul(x, 1/x, evaluate=False)
>>> expr
x/x
>>> expr.subs(x, 0)
nan
Результатом является «Не число», что означает, что оно не оценивается как число.
(В SymPy все деление умножается на взаимное количество: есть Add, Mul, Pow, но нет Div или Sub).