You should be able to accomplish it the way you described; your app code should not need to be in the extensions folder alongside the block. (in fact it probably shouldn’t as there is something like a 10MB size limit for these and Shopify is very strict about the extensions folder’s architecture).
All you should need in your assets folder is your app’s static js and css files. Just be sure to reference it correctly in your liquid file schema. It should look something like:
{% schema %}
{
"name": "ReactApp",
"javascript": "index.js",
"stylesheet": "index.css",
"target": "section",
"settings": []
}
{% endschema %}
That should work assuming it’s packaged correctly.