Das BIP39 sagt:
A user may decide to protect their mnemonic with a passphrase. If a passphrase is not present, an empty string „“ is used instead.
To create a binary seed from the mnemonic, we use the PBKDF2 function with a mnemonic sentence (in UTF-8 NFKD) used as the password and the string „mnemonic“ + passphrase (again in UTF-8 NFKD) used as the salt. The iteration count is set to 2048 and HMAC-SHA512 is used as the pseudo-random function. The length of the derived key is 512 bits (= 64 bytes).
Es ist also genauso wie @mowtan sagt.
Als Password wird der „mnemonic sentence“ verwendet, z.B. folgender String inkl. Leerzeichen:
true next sock harbor flush donkey spend virtual clown misery globe belt metal universe aspect anchor party lesson milk sort ship ecology tiny general
Als Salt wird dem String „mnemonic“ einfach entweder die Passphrase oder gar nichts angehängt, z.B.:
mnemonicSchatz1234
Da der Normalanwender bei einem frei wählbaren Passwort gerne mal „123456“ oder „Passwort!“ verwendet, macht ein Salt bei solchen Anwendungen Sinn. Die Liste beliebtester Passwörter könnte man sonst, wie du schon sagst, ohne Probleme durch Key Stretching Alogrithmen wie PBKDF2 jagen, um sie in vorbereiteten Listen/Tabellen zu speichern.
Bei 24 zufällig gewählten BIP39 Wörtern, mit einer Entropie von 256 Bit, braucht man tatsächlich keinen Salt. Schließlich kann man keine 2^{256} Passwörter vorverarbeiten, um sie in einer Tabelle zu hinterlegen. Sonst wäre ja auch jede Wallet ohne optionale Passphrase unsicher.
Die BIP39 Passphrase hat zahlreiche Use Cases, unabhängig davon als eigentlicher Salt zu dienen. Siehe die ganzen Artikel und Beiträge zur Passhrase hier im Forum (z.B. Optionale Passphrase ("25. Wort") - Braucht man das wirklich?).
Dass man die Passphrase als PBKDF2 Salt verwendet kommt vermutlich daher, dass man auf diese Weise ganz einfach den Mnemonic Sentence mit einer Passphrase zu einem 512 Bit Seed verwursten kann. Sicher weiß ich das aber auch nicht.