I don't know about "better" as I don't have a lot of experience with either—I've only dabbled or used them to prototype something small. The major differentiator is the JS implementation and ability to import libraries from sibling notebooks and other sources.
But yeah I'd have to agree that Bostock is a beast.
Observable does some things quite well for that use case:
-- Easier dependencies: no need for 'npm install', just 'require(...)'
-- URL publishing
-- Collaborative merge flow
However, Jupyter made some good decisions that make it win over Observable for our day-to-day data work:
-- Manual reexecution vs. automatic: when working with big data, outside APIs, etc., Observable's automatic reexecution is a non-starter
-- Fully open source, embeddable, and successful history of non-vc funding: Jupyter is organized and provided in a way companies ( who aren't Amazon ;-)) can rally around, evidenced by contributions by Bloomberg etc.
-- Access to underlying unix/windows env and multiple environments (multiple Python versions, ...). As much as I wish Observable's choice of JS could provide a viable data environment, and I've personally invested in making it so and the path to making it first-class is clear, we need way more gov/google/nvidia/etc. support.
Ultimately, for not-too-sensitive collaborative data work, we use Google Colab, then offline and sensitive commercial work via Jupyter (Graphistry ships with it preloaded for GPU dataframe & GPU visual graph analytics goodness!), and if we did more in JS tutorial land, Observable would be my first choice.
I haven’t gotten properly stuck into observable - in what ways is it better than using a jupyter notebook?