Почему при задавании атрибуты переходит сразу же по ссылке?
Потому что не отменено стандартное поведение
Думаю так будет понятнее:var a = document.querySelector(".a");
function change(e) {
	e.preventDefault()
	a.innerHTML = "www.w3s.com";
	a.setAttribute("href", "www.w3s.com");
	a.removeEventListener("click", change);
}
a.addEventListener("click", change)