QuickBasic could do this (IIRC it generated an EXE that bundled a bytecode interpreter along with your code). The slightly later QBASIC, which was a cut-down version of QuickBasic distributed free with DOS, couldn't make an EXE. The best you could do was to make a .BAT file that invoked QBASIC with the right options.
It's amazing, in retrospect, how important it felt to create a "real EXE". Nowadays, we write huge professional systems in scripting languages that need explicitly invoking with an interpreter - but back then, "grown up" programs were the ones that didn't need that.