Common Lisp uses let to bind both lexical and "special" (dynamic) variables. The behavior you expected was lexical and the behavior you observed was dynamic. The printer variables are all special, and so let creates a dynamic binding for them.
The printer variables are sometimes used in examples of why dynamic binding can be useful. For instance the fact that you can control the behavior of princ by binding *print-base* is enabled by dynamic binding, otherwise princ would reference the binding of *print-base* active when princ was defined.
This behavior is a major reason many Common Lisp programmers are adamant about the *earmuffs* naming convention for special variables. Note that defvar and defparameter both create special variables.