If we replace the Lam nodes with Case-Lam nodes of the form:

  ($ Case-Lam name ((params body) ...))

then we can no longer achieve the same logic with a single
match form, but need to factor out a utility function in order to
perform the recursion you suggest:

  (define (foo x)
    (define (match-body y)
      (match y
        (($ Cnd test pass fail)
         (foo-cnd test pass fail))
        (body
         (foo body))))
    (match x
      (($ Cnd test pass fail)
       (make-cnd (foo test) (foo pass) (foo fail)))
      (($ Seq ls)
       (make-seq (map foo ls)))
      (($ Case-Lam name ((params body) ...))
       (make-case-lam name (map list params (map match-body body))))
      (($ App ls ...)
       (make-app (map foo ls)))
      (else
       x)))

I would not want to write such compiler transformations on an
AST using case-lambda as a core form.

If you don't like the above code (I think with a pattern matcher having a catamorphism feature it will become quite natural), you can introduce a Body ast node and have each (case-)lambda contain only Body nodes.

Anyway, no one is forced to use case-lambda (or opt-lambda or whatever) in their own compiler. (Chez Scheme uses case-lambda in some of its intermediate languages (and one cannot say that is missing in the department of powerful compiler transformations).)

Marc