The way you/Magento are doing it is correct. As long as you have breadcrumb markup Google will display the category chain in SERP. In the case of multiple categories, the chain displayed depends on which category has most relevance for the keyword. When clicking the SERP you will be taken to the direct canonical page for the item, ie
domain.tdl/product-name.html, even if there is no direct way to get there via link.
This also brings up an interesting concept that many OP's disregard - true permalinks. This could help prevent future SEO and human access hiccups in certain cases. I don't mean the Wordpress definition of permalink either (they define it wrong). I mean a link based on item ID and not keyworded url/slug at all. The item ID never changes, whereas the keyworded slug could. Why is this useful? Less 301's and urls that are accessible forever in the case of a future name change.
Let's say you have an item with a url
domain.tdl/red-round-widget.html and you want to link to it from like 100 other item descriptions. You paste in that url, the links work, all is good. Then you change the name to
domain.tdl/red-circle-widget.html. Unless you don't forget to update, or you are using some kinda dynamic url construct/update method (ie PHP), this doesn't seem like a big deal -- just 301 the old url to the new, all those 100 links still work right. But then you change it again a few months later. And again later. You are now at 4 redirects via 301 to the newest url. This is not good since it's approaching a limit of 301 chaining that Googlebot does not like. How do you prevent this "does not like"? Make those 100 items use a permalink url of item ID instead, completely bypassing the keyworded slug. When bots run through the 100 links, they are dropped into an "ugly" url, but your canonical underneath tells them to see/use the most recent keyworded slug instead, without using a bunch of 301's.
I don't know off the top of the head what those permalink style urls look like in Magento, but it may be something like
domain.tdl/index.php?get=product&id=12345 to display product with an ID of 12345 (as an over-simplified example). You can use the same style permalink for things such as "email this page to a friend", social, bookmarking, or other widgets of that nature where long term url accessibility is paramount. This ensures that as long as the item has the same ID, the item will be accessible regardless of how much you change the url structure, the slug, or the parent category(s). It's not a super big deal if you don't ever change names or chain 301's, but it's helpful if you do. Hope that makes sense!