Как лучше ждать(проверять) выполнения функции (Monitor.Enter vs While(var))?
Используйте для этого Event. Скинули сигнальное состояние, сервис занят.
Для вашей задачи лучше ManualResetEvent. Сервис выполнил задачу и сам установил сигнальное состояние.
В других потоках будете просто писатьevent.WaitOne(<кол-во миллисекунд>);
Если нет сигнального состояния, ваш поток уснет на нужное время и проснется когда сервис завершит работу и установит сигнальное состояние или по истечению времени ожидания.
1.Если не используете lock, а руками пишите Enter exit, реализация неверная и не безопасная, гугл try finally taken.
2. While busy загрузит процессор (почти всегда)
 Советую почитать что-что, судя по вопросу , в этой теме Вы новичок. 
Все выше написанное абстрагированно от задач и wcf.
3. Busy использование не корректно в Вашем  коде.