The reason for what you are seeing is documented, but there is not a lot of detail or discussion of the implications provided in the documentation.
The CloudFront network has two tiers.
There's the outer "global" tier and the inner "regional" tier. Most AWS regions have a regional CloudFront edge in them, but not all -- and Hong Kong is currently an exception, an AWS region where there is not a regional edge.
Requests typically arrive at a "global edge" location near the viewer (e.g. Atlanta, GA, US) where the edge cache is checked and the content is served, or the request is forwarded to the origin.
But it's not forwarded directly to the origin.
Instead, the request is forwarded to the nearest "regional cache" (e.g. from Atlanta, that's probably Ohio, US -- the us-east-2 region) where that cache is checked for a response. If found, it's returned to the global edge that handled the original request, where it's stored in the cache (if cacheable) and returned to the viewer.
If the regional cache doesn't have a copy, either, then the request is forwarded from there to the origin server, and the response is cached at the regional cache, and returned to the original global edge, cached there too if possible, and returned to the viewer.
Statistically, this all works out fine on cache hits, even though in cases like this one it introduces a round-trip disadvantage on cache misses and uncacheable content, because the Hong Kong edge must consult the Singapore regional edge, which must then send a request back to EC2 in Hong Kong. (Atlanta to Ohio to Hong Kong is admittedly more sensible that Hong Kong to Singapore to Hong Kong).
This behavior would almost certainly change in the future if CloudFront deploys a regional edge in Hong Kong.
Round-trip benchmarks for a single request also don't necessarily tell the entire performance story, particularly in low-traffic environments. CloudFront supports http/2 and thus multiple requests can be processing in parallel on a single browser connection, which CloudFront handles in parallel on the back-end via series of independent HTTP/1.1 requests that it makes to the origin. CloudFront handles TLS negotiation with the browser at the global edge, and reuses connections from the global edge to the regional cache as well as from the regional cache to the origin server, so on a site that is actively handling traffic it becomes more likely that requests benefit from these optimizations, reducing the actual round-trip times from what can be observed in isolation.
See How CloudFront Works with Regional Edge Caches and the list of global and regional edges.
See Origin Keep-Alive Timeout for discussion of a customization you can make to your distribution configuration to increase the amount of time CloudFront holds open back-end connections for reuse; the default value is only 5 seconds, but you can increase it to 60 seconds, or possibly more by special arrangement. See also Custom Origins/Persistent Connections.