I don't normally like to make two answers to the same question, but this approach is so different from my prior answer that it seems like the right thing to do. Again, I'll just discuss your example.
We can model the problem as a finite-state absorbing Markov chain. We represent the state of the system as an ordered triple $(i,j,k)$ with $0\leq i\leq4,\ 0\leq j\leq5,\ 0\leq k\leq6.$ This means that $i$ $1$'s, $j$ $2$'s, and $k$ $3$'s have been rolled, except that if $i=4$ it means that at least $4$ $1$'s have been rolled, and similarly when $j=5$ or $k=6$. The chain has $210$ states, and the state $(4,5,6)$ is the only absorbing state.
As explained on the Wikipedia page, there is an exact formula for the expected time to absorption. I wrote a python script to calculate it.
import numpy as np
from functools import reduce
return reduce(lambda x,y:x*y, seq, 1)
s = [s+1 for s in seq]
coeffs = 
for t in s[:-1]:
z = zip(coeffs, seq)
return sum(a*b for a,b in z)
def trans(state, i):
state = list(state)
state[i] = min(state[i]+1, seq[i])
n = product(s+1 for s in seq) # number of states
p = 1/len(seq) # probability of given roll
states = itertools.product(*(range(s+1) for s in seq))
index = indexFunction(seq)
trans = transitionFunction(seq)
# build transition matrix
Q = np.zeros((n,n))
for s in states:
source = index(s)
for i in range(len(seq)):
target = index(trans(s, i))
Q[source, target] += p
# expected time to absorption
I = np.eye(n-1)
one = np.ones((n-1))
seq= [int(arg) for arg in sys.argv[1:]]
for idx, t in enumerate(seq):
print('%d occurs at least %d times'%(idx+1,t))
print(rolls(seq), "expected rolls")
Assuming this script is named rolls.py, then
python rolls.py 4 5 6
1 occurs at least 4 times
2 occurs at least 5 times
3 occurs at least 6 times
21.389264801531347 expected rolls
so about $21.4$ rolls are required.
This script will work for any number of faces on the die, and any number of required occurrences, so long as the overall matrix doesn't get too big.