You could try the following approach, with a secondary kernel (K2) and using CellInformation to check if a cell or notebook is currently in the "Evaluating" state:
Get the current evaluator names:
evaluators = EvaluatorNames /. Options[$FrontEnd, EvaluatorNames];
Add a "K2" kernel if there isn't one:
An example of evaluating the expression outside the notebook and then write the result in the notebook.
exampleNB = CreateDocument;
Cell["example of evaluating input programmatically",
Cell["D[Sin[ RandomReal x],x]", "Input", CellTags -> 1]];