This approach is very secure as soon as you can trust the email provider (namely, Google).
All other answers on MITM attacks are true in general. In this particular case, when operating within the same provider, additional considerations can be made with success.
1. Joe can't be (easily) impersonated
Since a decade ago, anyone can send you a crafted email coming from "a guy named Joe", or even from
[email protected] with what looks to be Joe's public key. Smallest providers (very, very, small email servers) might not enforce SPF policy.
Within the same email provider, and that is true for Gmail, additional checks are made to ensure nobody can forge a Gmail sender address. One has to hack Joe's account, which is out of the scope.
In short, assuming that Joe can't be hacked is enough to say that Joe can't be impersonated by malicious third party, and mail coming from Joe comes really
from Joe from Joe's email account.
2. You (must) trust your own provider
Since you use the same provider, I have to assume that you trust it. No matter how Google, in this particular case, is trustworthy, from a security standpoint there is one attack vector left. The provider should be rogue enough to change Joe's public key with a forged public key to disrupt secure communication.
What I mean is that the only actor capable of breaking security of your conversation is
Google Inc. themselves, because both of point #1 and because emails don't leave their own systems.
Answering your concerns
Google knows my public key (but not Joe's, since that is embedded inside the encrypted blob). This doesn't actually matter, though, does it? They can't do anything with my public key? The only thing it can be used for is to encrypt text one-way which only I can decrypt, because only I have the private key on my computer?
Assuming break of point 2, Google can impersonate you and alter your own public key with a key they know, and re-encrypt and re-sign the message at their will.
They have only one chance of action, and that is your first email "Hello Joe, this is my public key ABCDEF"
If they decide to manipulate my initial e-mail message, changing the key I sent to Joe, then Joe's reply will be unreadable by me, since it's no longer encrypted using my public key, but Google's intercepted key. That means Joe and I won't be having any conversation beyond that initial e-mail from me and the first reply by him (which Google can read), but after that, nothing happens since I can't read/decrypt his reply?
Google will have to eavesdrop and transcode the messages you exchange. If that happens, you won't be able to detect the attack, because both have initially put trust on the wrong key.
Email MITM example (with Alice, Bob, Charlie)
Charlie is a rogue email service provider
Alice (via Charlie):
Hello Bob, this is my public key ABC983 (attached key material)
Charlie generates a new keypair and replaces message
Hello Bob, this is my public key ZZZ765 (attached key material)
Bob receives the text, encrypts a new message with key
ZZZ765, which is a rogue key, and stores ZZZ765 in his trust store. Then sends the following email to Charlie for delivery
Nice to meet you Alice, please use DEX258 as my key.
---Encrypted using ZZZ765, signed using DEX258---
Charlie intercepts the email, decrypts using ZZZ765 to get the plaintext, then generates yet a new keypair.
Charlie delivers the following email to Alice
Nice to meet you Alice, please use FGN754 as my key
---Encrypted using ABC983, signed with FGN754---
Alice will trust the rogue key
FGN754 in their trust store.
Both parties will swear that they have genuinely talked each other securely until the day they meet at a bar, in person.
To their surprise, they will discover that they used the wrong keys and that the original emails differ from their "Sent mail" folder.
End of the story