Jestli to chápu správně, tak máte problém s aplikacemi, které nezapisují na standardní výstup, takže váš pokus o čtení příslušné roury "zamrzne" (čeká se na data, která nemusí nikdy přijít).
Pokud se tomuto chcete vyhnout, čtěte z rour asynchronně. Má to i výhodu v tom, že aplikace může psát na standardní výstup i standardní chybový výstup, což pro vás může být zajímavé rozlišit. Mrkněte na poslední parametr funkce ReadFile či na funkci ReadFileEx. Myslím ale, že pro asynchronní operace budete muset roury vytvářet přes CreateNamedPipe, abyste jim mohl nastavit FILE_FLAG_OVERLAPPED, protože pohodlné CreatePipe toto specifikovat nedovoluje.
Aplikace nemusí alokovat vlastní konzoli přes AllocConsole, ale může se připojit např. na konzoli svého rodiče (AttachConsole). Záleží také, jaké příznaky předáte při volání CreateProcess (pár jich ovlivňuje konzolové chování).
Pokud se vám nechce číst asynchronně, možná by se dalo vše zařídit tak, že vytvoříte vlastní rouru a předáte ji aplikaci jako standardní výstupy. Pokud bude ke každému konci roury existovat nejvýše jedno handle, vaše aplikace "odmrzne", jakmile spuštěná aplikace zavře handle ke svému konci roury (dostanete něco jako ERROR_BROKEN_PIPE). Problém samozřejmě je, že aplikace obvykle zavírají tato handle až v momeně svého ukončení.