The Observable built-in "now" has no temporal spacing, it's just a generator that yields Dte.now(): https://github.com/observablehq/stdlib/blob/master/src/now.js
What you're observing is the difference in requestAnimationFrame(), which is what drives Observable's evaluation of generator cells.
I've read that Safari throttles requestAnimationFrame to 30 fps in cross-origin iframes without user interaction. Changing frameCap will likely count as interaction and thus remove the throttling.