Попробуйте это так:
^(?=.*\d.*?\d.*?\d.*?\d)(?=.*[a-zA-Z].*?[a-zA-Z]).+$
Поскольку в вопросе не указано, какой длины может быть такая строка, любая длина принимается, пока выполняется основное правило.
Демо
const regex = /^(?=.*\d.*?\d.*?\d.*?\d)(?=.*[a-zA-Z].*?[a-zA-Z]).+$/gm;
const str = `aa1111
b1b111
1111aa
11a1a1
1a11a1
aaaa11
bbb111
b1b1b1
b11b1b`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match) => {
console.log(`Found match: ${match}`);
});
}