В вашем регулярном выражении [^:]+(?=:)
вы соответствуете 1+ раз, а не двоеточие, и утверждаете, что в конце должно быть двоеточие, что приводит к совпадению для /user/
Если вы хотите использовать отрицательный класс символов, вы можете указать двоеточие, а не косую черту:
:[^\/]+
const str = `/user/:username/`;
const result = str.replace(/:[^\/]+/, "harry");
console.log(result);