単純なループにはできそうにないのでは

(define (dotted-for-each f x)
(if (list? x) (for-each f x)
(do ((x x (cdr x))
((not (pair? x)) (f x))
(f (car x)))))

(define (for-each-pair f g pair r)
(cond ((pair? pair) (dotted-for-each (lambda (pair) (for-each-pair f g pair r))
pair))
((null? pair) r)
(else (g (f pair) r))))