Unfortunately, Google doesn't have an API event to track this, but we can use the Mutation Observer Web API to track DOM changes by Google API on our own.
It's supported by browsers pretty well:

First, we need to create a target element that we will observe for Google iframe appearance. We are going to target document.body as an iframe will be appended to it:
const targetElement = document.body;
Then we need to create a config object for MutationObserver. Here we can specify what exactly we will tracking in DOM changes. Please note that all values are 'false' by default so we can only leave 'childList' - which means that we will observe only the child node changes for the target element - document.body in our case:
const observerConfig = {
childList: true,
attributes: false,
attributeOldValue: false,
characterData: false,
characterDataOldValue: false,
subtree: false
};
Then we need to create a function that will be invoked when an observer detects a specific type of DOM change that we specified in config object. The first argument represents an array of Mutation Observer objects
function DOMChangeCallbackFunction(mutationRecords) {
mutationRecords.forEach((mutationRecord) => {
if (mutationRecord.addedNodes.length) { //check only when notes were added to DOM
var reCaptchaParentContainer = mutationRecord.addedNodes[0];
var reCaptchaIframe = reCaptchaParentContainer.querySelectorAll('iframe[title*="recaptcha"]');
if (reCaptchaIframe.length) { // Google reCaptcha iframe was loaded
console.log('Yay!');
reCaptchaObserver.disconnect(); // We don't want to observe more DOM changes for better performance
// Challenge was loaded -- DO SOMETHING HERE
}
}
});
}
That is almost it. The only things that are left - instantiating an observer itself and starting observing DOM changes:
const reCaptchaObserver = new MutationObserver(DOMChangeCallbackFunction);
reCaptchaObserver.observe(targetElement, observerConfig);
I hope that helps :)