There is a reason for the API design of ClientInterceptors.
intercept(..) returning a Channel rather than ManagedChannel: The original managed channel is the single entity that is responsible for the life-cycle of the channel. If you are not the owner of the original ManagedChannel instance, you are not responsible and should not shut it down. If you are owner of the original ManageChannel, you are responsible to shut it down, and you need pass the reference to the original ManagedChannel to the caller of shutdown().
That might be very inconvenient in some cases, but that's how it is supposed to work.