Apple engineer confirmed that this is the expected behaviour:
According to RFC 2732 Section 2, IPv6 addresses must be enclosed in [ and ] when it’s part of an URL. In this particular case, the host should be ipv6URLComponents.host = “[2001:0000:3238:dfe1:0063:0000:0000:fefb]”.
I can confirm that the suggested solution works in iOS 16.
However, the problem is that it is only a workaround, since enclosing IPv6 address in [] does not work in iOS 15 and older. So I still need to use if #available(iOS 16.0, *) {} syntax if I want my code to work in both iOS 15 and 16.
I don't expect any updates regarding the issue. Just posting this in case someone with the same problem lands here.