В принципе как я и говорил, это заслуга системы шорткаров Qt. (верно для версии 4.7.2)
В самом шорткаре содержится следующая структура:

Клавиша, контекст, enabled, autorepeat, id и ... owner - родитель шорткара.
По нижеследующему коду проверяется следующее - 
Контекст шорткара (context), виджет, который привязан к шорткару(owner) и активное окно приложения 

Если родитель невидим или отключен - мы убиваем шорткар... В общем то это и есть ответ на ваш вопрос - почему не работает. Потому что такая логика заложена в систему шорткаров Qt при использовании QAction. 
Решением проблемы будут QShortcut с родителем в виде главного окна приложения. Правда остаётся проблема надписей, но тут я умываю руки - итак покопался 

bool QShortcutMap::correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window) const
{
    bool visible = w->isVisible();    
#ifdef Q_WS_MAC
    if (!qApp->testAttribute(Qt::AA_DontUseNativeMenuBar) && qobject_cast<QMenuBar *>(w))
        visible = true;
#endif
    if (!visible || !w->isEnabled())
        return false;
    if (context == Qt::ApplicationShortcut)
        return QApplicationPrivate::tryModalHelper(w, 0); // true, unless w is shadowed by a modal dialog
    if (context == Qt::WidgetShortcut)
        return w == QApplication::focusWidget();
    if (context == Qt::WidgetWithChildrenShortcut) {
        const QWidget *tw = QApplication::focusWidget();
        while (tw && tw != w && (tw->windowType() == Qt::Widget || tw->windowType() == Qt::Popup))
            tw = tw->parentWidget();
        return tw == w;
    }
PS уфф...
PPS я так и не нашёл где напрямую написано это в Assistant, но я думаю что таие строки там есть.