A function can. Coincidentally, I have a function with the same name and definition as your example. Actually, after doing a double-take on your alias, I see it can't work like you probably expect. You can't use arguments like that. It's simply substitution. If you do:
mkcd someplace
that'd result in:
mkdir -p "$1" && cd "$1" someplace
you want:
mkcd() { mkdir -p "$1" && cd "$1"; }
Anyway, it's subprocesses that can't control the working directory of the parent process (or other processes for that matter). A process can only control its own working directory.