The problem is that you're actually reading two characters. The one you typed, plus the line break. I tried to preserve as much as possible from your original solution, and this is what I came up with:
(define getUserChar
(lambda ()
(define ch #\0)
(let loop ()
(display "Enter character: ")
(set! ch (string-ref (read-line) 0))
(if (not (char=? ch #\x))
(begin
(display ch)
(newline)
(loop))))))
IMHO a more idiomatic solution doesn't require a mutation operation, I prefer this one:
(define (getUserChar)
(let loop ((ch #\0))
(unless (char=? ch #\x)
(display "Enter character: ")
(let ((ch (string-ref (read-line) 0)))
(display ch)
(newline)
(loop ch)))))