SICP exercise 1.28 - miller-rabin primality test part II
Stylistically, I'd write it this way:

;; expmode b e m = b^e modulo m
(define (expmod b e m)
  (define (expmod-iter acc b e)      ; iterative accumulation
    (define bsq (remainder (* b b) m))
    (cond ((= e 0) acc)
          ((and (not (= b (- m 1)))
                (not (= b 1))
                (= bsq 1))
           0)
          ((even? exp)
           (expmod-iter acc bsq (/ e 2)))
          (else
           (expmod-iter (remainder (* acc b) m)
                        b
                        (- e 1)))))
  (expmod-iter 1 b e))               ; initial accumulator = 1

(define (miller-rabin-test n)
  (define (try-it b)
    (if (and (= b 1)
             (&gt; n 2))
        (miller-rabin-test n)
        (= (expmod b (- n 1) n) 
           1)))
  (try-it (random 1 n)))     

(define (fast-prime? n times)
  (or (= times 0)
      (and (&gt; times 0)
           (miller-rabin-test n)
           (fast-prime? n (- times 1)))))


You've corrected the error of not taking the remainder of the square.

There's no need to define a function square just to save one call to *.

You've converted your recursive expmod into iterative code; although I wouldn't call the former "horrible" since its complexity is only logarithmic, so recursion depth is kept in check.

Assuming you're using Racket, (+ 1 (random (- n 1))) can be written simply (random 1 n).

You've kept the awkward encoding for fast-prime? which is more naturally coded directly with the logical connectives.

Will think over some more with regards to its correctness, that you ask about.