Based on comments from Lex on my PR for global loot modifiers (so that modders don't need to replace loot tables when creating new enchantments and other effects), one of the sample test mods is set as making a specific item act like silk touch (the use-case was someone wanted one of their mod items to silk-touch harvest glass blocks and only glass blocks, the test mod doesn't do the check for glass, but the general process is going to be the same).
As such, invoking the existing loot tables with the extra context parameter (or rather, a modified itemstack parameter) in order to not make assumptions about what silk touch actually does (as someone could create a block that drops something besides itself when harvested with silk touch) to generate the correct loot is the correct approach.
However, this requires rebuilding the LootContext object and Lex made this comment:
https://github.com/MinecraftForge/MinecraftForge/pull/6401#discussion_r363968404
What is the better way to do this? Using reflection to access the private-final fields does not feel correct to me, as any changes made need to be undone after invoking the loot table generate (as there may be future loot modifiers waiting to be processed), which is why I (attempted to) clone the context object.