Não consigo reproduzir seu problema, mas pode ser que você tenha ativado o modo cua e evite desativar o modo de marca transiente. Tente alternar M-x cua-mode
até que você tenha desativado e, depois, alterne M-x transient-mark-mode
até que ele seja desativado . Então, verifique se isso resolve você.
Como nota, parece estranho para mim, que você gosta do Emacs23 (já que você o usava há anos) e odeia o Emacs24. O que deu errado quando você tentou o Emacs24?
Editar
Aqui está o query-replace-regexp-to-the-end-of-buffer-or-in-a-region
defun que faz o que você quer:
(defun query-replace-regexp-to-the-end-of-buffer-or-in-a-region (point)
"If there's a region - query replaces regexp in region,
otherwise replaces from current point to the end of buffer."
(interactive "d")
(let (start end)
(if (use-region-p)
(progn (setq start (region-beginning)) ;; then
(setq end (region-end)))
(progn (setq start point) ;; else
(setq end (point-max))))
(set-mark start)
(goto-char end)
(apply #'query-replace-regexp
(let ((common (query-replace-read-args (concat "Query replace regexp") t)))
(list (nth 0 common) (nth 1 common) (nth 2 common) (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))))))
Basta vinculá-lo a alguma chave, talvez até mesmo a M-%
.