Have you checked if your firewall keeps track of the connections to/from the clients? There is typically a limit of how many such connections can be tracked. Optimally, you should not store connection state for NTP queries and their responses at all.
I’m not familiar with how OpenBSD does these things, but on Linux “conntrack -L” should show the current connection tracking table. On OpenBSD it might be “pfctl -s states”. “pfctl -s info” and its state-limit (“configured state limit was reached”) row might also be informative.
There should be at most a handful of connection tracking entries for UDP/123, possibly for your own NTP server’s queries to upstream NTP servers. You should not be seeing hundreds of connection tracking entries for regular NTP clients. Otherwise there’s a risk that the connection tracking limits get exceeded at some point.
You mentioned that you have set up similar pool servers elsewhere, but I think it is possible that those other servers have a lower query rate that does not exceed the connection tracking limits. There’s lots of NTP pool traffic in Singapore.
Edit: Overnight ping might not show anything useful. As can be seen from the linked graphs, there seems to be packet loss to your server between 02:00 and 15:00 UTC, probably correlating with the NTP traffic levels. During quieter times the ping will likely work fine.