Well, I finally got it.
As stated in this excellent article by Mathias Bynens, "Javascript has a Unicode problem".
I recommend reading the article, but in short, the thing is that depending on what unicode character you want to represent in javascript, you may need to actually use two characters together, which are called the "two surrogate halves" that form the actual character. This link also from the same author explains the formula to calculate these two halves based on the codepoint of the character.
However, I've found the site https://codepoints.net that lists all the characters and gives you the correct representation for different languages, Javascript and JSON among them.
For example, this is the page for the "thumbsup" character: https://codepoints.net/U+1F44D
There, under "Representations", if you click on "show more", you'll see many representations for different languages. For the thumbsup, that has the codepoint U+1F44D
, the javascript representation is with this two surrogate halves: \uD83D\uDC4D
So, if you send the javascript string '\uD83D\uDC4D'
to a unicode-enabled client, you should see the corresponding emoji.
Note: I ended up not implementing a Google chat bot (XMPP), but a Telegram bot using the Telegram API, but the key concepts are the same.