I guess my thinking is that REPLACE() is intended to allow the query writer to ask that a value be replaced with some other value.
I understand that NULL is not a value as such but it can be assigned to be the contents of a column or variable or function parameter. So I'm not sure why the REPLACE() function could not allow a NULL value to be replaced with a string. In other words, say "string_expression" evaluates to NULL. Then the second parameter "string_Pattern" could be passed in as NULL and the string_replacement could be 'NONE' similar to ISNULL().
REPLACE ( string_expression , string_pattern , string_replacement )
I suppose since ISNULL() already does that and that "string_expression" can never be non-NULL if any part of the string passed in is NULL (as when trying to concatenate a string with a NULL) then MS figured there was no point in allowing it in the function? I'm not saying REPLACE() should behave this way, just that I don't know if it is per se the only way to have the function behave.