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.