Então, depois de quase estragar meu computador, encontrei uma solução alternativa — provavelmente não a ideal 
Parece que, ao clicar em Responder dentro do Full App Embed, o compositor abre corretamente no DOM (#reply-control.open), mas, por algum motivo, permanece com display: none.
Confirmei isso no console do navegador: o compositor estava presente, mas seu valor calculado de display era “none”. Executar manualmente:
document.querySelector('#reply-control').style.setProperty('display', 'block', 'important');
fez o compositor aparecer imediatamente e tudo funcionou normalmente.
Como solução alternativa, adicionar o seguinte JS ao tema do Discourse corrige o problema para mim:
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
if (!document.body.classList.contains("embed-mode")) {
return;
}
const fixComposer = () => {
const composer = document.querySelector("#reply-control.open");
if (composer) {
composer.style.setProperty("display", "block", "important");
}
};
const observer = new MutationObserver(fixComposer);
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ["class"],
});
fixComposer();
});
Isso parece corrigir completamente, e limitei a solução alternativa ao embed-mode para que não afete a interface normal do Discourse.
Obviamente, isso provavelmente não é a solução de longo prazo ideal, mas espero que ajude a identificar o que está fazendo o compositor aberto permanecer com display: none no Full App Embed.