Как сделать, чтобы смена хеша через window.location.hash не отправляла к этому хешу?
Взять элемент с id на который будешь ссылаться.
Убрать аттрибут id.
Поменять hash.
Поставить id.
Касательно History API, вот тут webonrails.ru/post/990 нормально описано как "починить" кнопку "Назад". Читайте про событие popstate.