@mitu your setup works because your emulationstation is running from the environment spawned by getty@tty1 and inherits its environment, including standard input and output.
With systemd, services do not inherit the environment of another service. So a process that owns tty1, like login will prevent other processes from other services from using that descriptor, especially when the other processes are non-root, like emulationstation.
I found when running getty as a systemd service, the instance getty@tty1 needs to be stopped fully (including a stale login process that getty instances seem to leave behind) before emulationstation can make use tty1 for standard input and output. Instances on other tty's may be left as is.
The following entry in emulationstation.service will stop getty@tty1 if running:
ExecStartPre=+sh -c 'systemctl is-active getty@tty1 && systemctl stop getty@tty1 || systemctl reset-failed getty@tty1'
ps auxf shows the tty a process is running with.