I have to admit I struggled to understand your question a bit here, rather than screenshots you could copy and paste as code examples if it helps.
What I understand if you have a view on COL_A . Reading the aggregation above it gets the first document for each value if data._id, removes those that have been ‘deleted’ then sorts by _id.
This itself has some issues. Your sort cannot use an index in this case and also you are using $first but not sorting first so you have no guarantee what is first (unless all values are the same an you just want any of them). for ViewA you should first sort (using an index) by data._id. You might also want to put the match before the group too .
This get to the heart of your lookup issue lookup - lookup uses a nested loop search - so for every document in ViewA it will either run a find() (on a collection, ideally using an index) or the aggregation defined in the view - if you view defines an unoptimised aggregation ( like your view on A - you don’t share the view on B) you will run that many times (once per document in A) and the performance will suck.
There are a whole bunch of ways to optimise something like this but unless you can share more - like a minimal example of col_a,col_b and the code of view_a and view_b I can’t help you redo them, aside from the fields you show data._id, projectId and srting.data.projectName you don’t need any other fields in your examples unless you user them in the views.