There are three different scenarios, first of all with plymouth which causes that systems-vconsole-setup is called very early in dracut and with LANG set to the value in /etc/locale.conf. During plymouth(d) is running all calls of systems-vconsole-setup will come (partly) to nothing. Then we have the case without plymouth (rpm -e plymouth plymouth-dracut && mkinitrd). In this case the systems-vconsole-setup is called later than in first case and now includes LANG and LC_CTYPE from /etc/locale.conf and /etc/sysconfig/language (see ROOT_USES_LANG case "ctype"). My guess is that now dracut has included /etc/sysconfig/language and therefore LC_CTYPE is set as well. The last case is the udev rule /usr/lib/udev/rules.d/90-vconsole.rules with the line ACTION=="add", SUBSYSTEM=="graphics", KERNEL=="fbcon", RUN+="/usr/lib/systemd/systemd-vconsole-setup" which changes also the virtual consoles and is only in action if no plymouth is active as otherwise systems-vconsole-setup will come (partly) to nothing. Without plymouth the last case does set UTF8 even with LANG=POSIX in /etc/locale.conf and ROOT_USES_LANG not set in /etc/sysconfig/language. That is that all three calls uses different an environment respectively the locale due to the function is_locale_utf8() from systemd-210/src/shared/util.c or systemd-git/src/basic/locale-util.c