Как на JavaScript и replace заменить все вхождения, а не только первое?

Добавь ‘g’ в конец регулярного выражения, чтобы задать поиск по всему тексту:

function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
return text.replace(exp,"<a href=''$1''>$1</a>");
}

Однако, отмечу, что Ваша функция несовершенна и будет пропускать URL, записанные в некоторых форматах, например, если после адреса будет идти запятая (http://www.example.com,) и т.д. О поддержке кириллических адресов вообще речи не идёт. Но это уже другой вопрос.