Rust, 117 91 bytes
Requires inputs to be lowercased and it might break horrendously on multibyte characters as per the challenge's allowances. Officially only supports single-byte character input.
|s:&str|s.split(' ').any(|w|w.starts_with("ill")&&(w.len()<4||!"aiouy".contains(&w[3..4])))
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
.split(' ') // split on literal space and iterate over the words
.any(|word| // Check if any of the splits match a predicate
word.starts_with("ill") // explains itself
&& (
word.len()<4 // "ill" is the whole word, sick
// OR the title does not match the pattern of false positives
|| !"aiouy".contains(&w[3..4]) // so it's sick
// Rust doesn't allow byte indexing of strings, as some indices
// may not be whole characters, it does allow indexing ranges
// So this is effectively &w[3], but it panics if the char at
// this position happens to be more than one byte long
)
)
}