In the example application I linked, TVM generates C code as the final output format, this includes C sources generated via the BYOC integration for the microNPU. The C code from TVM is extracted from a generated archive (in Model Library Format) and added to the sources list of the application, so you have something similar to (codegen is the output from TVM):
gcc -o demo_app \
src/demo.c \
codegen/host/src/default_lib0.c \
codegen/host/src/default_lib1.c
Which allows you to specify your own GCC flags easily and integrate it as part of an existing C application.
What @comaniac is suggesting is to instead use BYOC to generate C code, and use TVM to generate a binary from it (which invokes GCC behind the scenes if I remember correctly). A good example of this can be seen in the external code generation tests, which uses the export_library method to convert the model into a binary shared object. This lets you use more of the Python interface to TVM and is better suited to richer environments.