1.Just like what adiii4 suggests.
You can call the post-build-event as an alternative way. Copy the ng serve command into the post-build-event textbox.
2.And to achieve this goal: execute ng serve command when i start IIS Express
Since we can run IIS express from command-line,you can add the two commands in post-build-event by newlines like this issue.
3.In addition,a post-build-event will run every time you build the project.(No matter debug or release mode)
I'm not sure if this meet your needs well, we can customize it by Right-click Project=>Unload Project=>Edit xxx.csproj.
e.g: We'll find the PostBuild Target at the bottom, add a Condition=" '$(Configuration)' == 'Debug' " can help control only in debug mode to execute ng serve command and start IIS Express like:
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)'=='Debug'">
<Exec Command="here commad1:call test.exe
here command2:xxx.exe xxx" />
</Target>
Update:
When we add something in post-build-event, the Target "PostBuild" will be added into xxx.csproj file automatically (Below format is for asp.net core web app).
And we can add a custom script like below to do another target after the build engine run the PostBuild target. For your situation, ngserve.bat is for ng serve, and startIIS.bat is for starting IIS.
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="call ngserve.bat" />
</Target>
<Target Name="StartIIS" AfterTargets="PostBuild">
<Exec Command="call startIIS.bat"/>
</Target>

In addition: In VS, we can go Tools=>options=>Projects and solutions=>Build and run to change the msbuild project build output verbosity to detailed. After that, every time we build the solution or project, we can see detailed info about the build process, which helps troubleshooting.