Первая часть вашего шаблона соответствует любому отдельному символу, который не >
или возврат каретки или перевод строки, но он не добавляет это обратно в строку результата.Таким образом, он всегда ест последний символ перед переводом строки.
Попробуйте:
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, "$1" + breakTag);