For samples compiled as native code, any Windows static analysis tool we've already discussed will do the trick. In this case, the solutions that are able to effectively apply structures (such as IDA, Binary Ninja, or radare2) can definitely save time:
VB Decompiler can be used to quickly access the names of procedures without digging into VB structures. For IDA, a free vb.idc script can be obtained from the official Download Center page. It automatically marks up most of the important structures, as well as the corresponding pointers, and this way makes the analysis much more straightforward.
Overall, it is always possible to find the address of the SubMain function by taking the address of the VB header (as we know now, it is passed to the ThunRTMain function in the first instruction at the sample's entry point) and get the address of the SubMain by its offset...