Rust, 117 bytes
Or 118 if we count 'y' as a vowel.
|s:&str|s.to_lowercase().split(' ').any(|w|w.starts_with("ill")&&w.chars().nth(3).is_none_or(|c|!"aiou".contains(c)))
Ungolfed and explained:
// Non-regex answer; unless depending on flavor-specific behavior, there's two
// regex answers already, they're just tagged as JS (ES6)
fn sick(album: &str) -> bool {
// Rely on implicit returns
album.to_lowercase() // explains itself
.split(' ') // split on literal space and iterate over the words
.any(|word|{ // Check if any of the splits matches a predicate function
word.starts_with("ill") // explains itself
&& word.chars() // iterate over the chars that make up the string
.nth(3) // get the character with 0-based index 3, if it exists
.is_none_or( // If the char does not exist, the word *is* ill
// Otherwise we return the result of a checking function
|c|!"aiou".contains(c) // non-e vowel check to skip false positives
)
})
}