None of the two choices is necessarily optimal.
If you use a mirrored copy of the products in the Bubble database, you are unnecessarily wasting WUs and costing yourself more ‘money’ to provide the same functionality. Don’t be wasteful in your resources.
Use Data Jedi or another plugin that allows you to turn JSON into API Objects and a Hybrid Data Structure approach.
Since you do NEED all 10,000 items on the page (some developers usually state you never would but there are use cases for when you would and this seems like one of those), you do not want to have to pay Bubble 0.015*10,000 WUs to get those onto the page if you do not need to.
With a hybrid data structure approach and Data Jedi plugin you can take that Airtable list (I expect it to not change or at least not frequently) and save a JSON file and use that JSON file to load all 10,000 items for less than 1 WU (close to 0.25).
I have. It is the plugin I built, Data Jedi, that makes this fast, cheap and overall the best way to solve for such situations.
For your specific case, you can use the Data Jedi plugin in conjunction with the Airtable API call one time so that you can then use the Data Jedi plugin to create the JSON file, then save the file as an attribute on an Option set, and then on the page for the users, you just load that file into the Data Jedi element and you’ve got 10,000 items on the page for around 0.25 WUs nearly instantly (faster than a search and retrieval of 10,000 bubble database objects that is for sure).
You can use the Data Jedi plugin actions to modify the items on the client device, quickly and for no cost.
Mirrored copy is going to cost much more WU and be slower than using a Hybrid Data Structure approach.