It makes sense to ensure that quaternions are normalized before using them to do things that require them to be normalized to make sense (like transforming a vector), but it is entirely valid to multiply non-normalized quaternions. Such a use case is in implementing dual quaternions, in which case we routinely multiply the (normalized) real-part quat with the (non-normalized in and of itself) dual-part quat.
It makes sense to ensure that quaternions are normalized before using them to do things that require them to be normalized to make sense (like transforming a vector), but it is entirely valid to multiply non-normalized quaternions. Such a use case is in implementing dual quaternions, in which case we routinely multiply the (normalized) real-part quat with the (non-normalized in and of itself) dual-part quat.