At run time, the expressions are evaluated from top to bottom and from left to right. However, the bindings are determined at expansion time and have nothing to do with run time.
For modules, the bindings are mutually recursive. This is what the code looks like after expansion (check the macro stepper):
#lang racket
(display "before plus")
(newline)
+
(display "before add-vect-vect")
(newline)
(define (add-vect-vect v1 v2) (map + v1 v2))
(display "before overload")
(newline)
(define +
(create-overloaded-operator
+
add-vect-vect
(list list? list?)))))
Because module-level bindings are mutually recursive, the + in line 4 refers to the + define at the end of the code. Therefore, at run time line 4 of the code tries to use the value of + that has not been evaluated yet, leading to the error you see. This is the same class of runtime errors as this piece of code:
#lang racket
(+ x y) ;; <- x and y has not been evaluated yet
(define x 5)
(define y 8)