R, 3435 bytes
\(x)grepl("\\bIll([^aiou]|$[^aiouy]|$)",x,T)
Attempt This Online!Attempt This Online!
grepl(
"
\\b # a word boundary
Ill # followed by "Ill"
([^aiou]|$[^aiouy]|$) # followed by either a non-aiouaiouy character OR end of string"
"
x,
T # ignore.case = TRUE
)
Obviously we could port the same pattern used in JS answers:
R, 3536 bytes
\(x)grepl("\\bIll(?![aiou][aiouy])",x,T,T)