Seventy Seven Sevens
Jelly, 21 20 19 18 bytes
R7ẋḌµ;ŒċP€⁹f€FµÐLḟ
Note that the output doesn't match the OP's. I've left a comment.
Try it online!
How it works
R7ẋḌµ;ŒċP€⁹f€FµÐLḟ Main link. Left argument: n. Right argument: l
R Range; yield [1, ..., n].
7ẋ Times; yield [[7], ..., [7] * n].
Ḍ Undecimal; yield s := [7, 77, ...].
µ µÐL Begin a new chain with argument s and call the chain between
until the results no longer chain.
Return the last unique result.
Œċ Combinations; return all unordered pairs in integers in the
return value.
; Concatenate the return value and its pairs.
P€ Take the product of each individual integer and each pair in
the result.
⁹f€ Filter each; for each j in [1, ..., l], intersect [j] with the
array of products. The result is sorted and contains no
duplicates.
ḟ Filterfalse; remove the elements of s from the result.
Python 2, 116 113 109 bytes
n,l=input()
r=t={1}
exec't|={10**n/9*7};n-=n>1;r=r|{x*y for x in r for y in t if l/x/y};'*l
print sorted(r-t)
Note that TIO doesn't have enough memory for the last test case.
Try it online!
JavaScript (ES6), 103 101 bytes
Takes input in currying syntax (n)(l)
.
n=>l=>(a=[],g=(n,m,p,i)=>(p>l||g(n,m,(a[i>1?p:a]=p)*m,-~i),--n?g(n,m+7,p,i):a.filter(n=>n)))(n,'7',1)
Test cases
The last test case may take a few seconds to complete.
let f =
n=>l=>(a=[],g=(n,m,p,i)=>(p>l||g(n,m,(a[i>1?p:a]=p)*m,-~i),--n?g(n,m+7,p,i):a.filter(n=>n)))(n,'7',1)
console.log(f(1)(49))
console.log(f(1)(343))
console.log(f(2)(6000))
console.log(f(3)(604000))