The practical aspect of this (besides that msvcp140 just should not probably load msvcp120) is that for an app using VC runtime 140 mspcp140.__ExceptionPtrCurrentException gets the thread data from msvcp120.dll while vcruntime140_1 sets those thread data from ucrtbase.dll which are different data. So the application calling mspcp140.__ExceptionPtrCurrentException in catch block gets NULL exception while it was technically set by vcruntime140_1 before calling the app's catch block handler. After this patchset all the current exception data should end up in ucrtbase for VC runtime 140.
There is a bit more to it (not covered by this patchset) when there is a mix of native and builtin VC runtime 140 dlls. From the app behaviour and some tests it looks like with native DLLs msvcp140 and vcruntime140_1 handle current exception data through vcruntime140.dll and vcruntime140.dll does not forward that to ucrtbase. I am not sure if the latter (not forwarding vcruntime140->ucrtbase) is practically important but to avoid the similar problem when mixing native and builtin VC runtime DLLs we should also probably link msvcp140 and vcruntime140_1 to vcruntime140.
-- v2: msvcp140: Import __ExceptionPtrCompare implementation. msvcp140: Import __ExceptionPtrCopyException implementation. msvcp140: Import __ExceptionPtrToBool implementation. msvcp140: Import __ExceptionPtrCurrentException implementation. msvcp140: Import __ExceptionPtrRethrow implementation. msvcp140: Import __ExceptionPtrAssign implementation. msvcp140: Import __ExceptionPtrCopy implementation.