That just shows there are pointer values that can be marshaled, not that all such values won't error. If you have a non-nil pointer that points to an object that transitively contains one of the unsupported types, you will get an error.
I read that differently. If you have a non-nil pointer then you get the address of the pointer irrespective of what that pointer points too.
I'm not sure how you are getting that from "otherwise it is the recursively JSON-encoded representation of the underlying value", but here is a playground example, where using a non-nil pointer to a channel produces an error:
https://go.dev/play/p/JXYuGUQ0TLQ
The doc you linked to literally proves me right.