ooh ah, you ask a lot of important questions…
Is this an expected behavior from using CloudKit?
To some degree, yes, as it is specifically designed for backup and sync, and only incidentally does web. Speed is not a feature. That said, you should definitely be using qualityOfService so the system can optimize results. For instance, you might set it high to retrieve thumbnails, and set it low for background uploads.
Is CloudKit even a viable option for this kind of app, or is it not designed for this type of app?
I think it is viable, though on the public database you have to give very serious consideration to moderation, as well as the limits on public space as it related to the number of users of the app.
What alternative approaches could be taken? (Eg. store assets in AWS...)
you could go with another cloud service, but then you'd have to consider the costs.
Also, regardless of your backend, think thru how to handle large uploads and downloads in the background. For CloudKit, this means leveraging long-lived operations. See CloudCore for an example https://github.com/deeje/CloudCore/blob/master/Source/Classes/Caching/CloudCoreCacheManager.swift