Presents a false dichotomy from my perspective.
Nothing stopped you from creating a AssetServiceProtocol in your MVVM approach, making your APIUtility conform to that, and then injecting said service into the view model.
Which in turn would have granted a better separation of concerns and allowed you to better test your VM code.
Further, your AssetListPresenterProtocol is fundamentally a delegate, which works fairly well in UIKit but breaks down if you're using SwiftUI where views aren't reference types.
The sample code is also a bit disingenuous in that the MVVM example you're including the collection view layout code, registration code, and the Coordinator code, while the second example does not.
Which in turn makes the second example look better even though it's littered with additional protocols and boilerplate.
Also missed where the Codable model Asset is mapped to the domain model Asset?
Bottom line is that the MVVM approach and code comparisons could have been better, with a better comparison of apple's to apple's and not cooking the books to make the "clean" approach appear cleaner. ;)
Appreciate the read.