I think this is to ensure users with tibble installed gets the tibble awesomeness, and that users without tibble installed do not get any issue.
Digging a bit into the GitHub history, this was added by a PR that provides some context:
This uses a couple of tricks (a delayed binding and an .R file in the data/ directory) to conditionally use tibbles if tibble is installed. I think this gives the best of both worlds — if you're teaching a tidyverse centric course, you'll get tibbles; if you're running in a low dependency environment, you'll get a data frame.
The penguins object will never behave differently in a given session; it will either be a pure data frame or a tibble after it is accessed for the first time. It will behave differently in another session if you later install tibble, but I think this should be a relatively rare scenario.