Свою военно-морскую карьеру начал мичманом Королевского флота. В 1745 (или 1746) году получил чин лейтенанта, в 1757 году — коммандера, с 1758 года — капитан.
Участвовал в Семилетней войне. В 1758 году участвовал в высадке войск на территории Франции, попал в плен.
Командовал кораблем 6 ранга Eurus при Квебеке, затем фрегатом HMS Richmond. Командуя им, 24 января 1761 года загнал на берег под Схевенингеном французскую F?liciti?; был при взятии Гаваны в 1762 году.
После окончания Семилетней войны до 1767 года командовал 60-пушечным линейным кораблем HMS Firme.
По протекции британского посла в Петербурге лорда Кэтчерта был принят на русскую службу 30 мая 1769 года, а уже 29 июня высочайшим приказом произведен в контр-адмиралы «сверх комплекта». Эльфинстон был назначен командиром линейного корабля «Не тронь меня».
Эльфинстон возглавил вторую эскадру Первой Архипелагской экспедиции в составе 3-х линейных кораблей («Тверь», «Саратов», «Не тронь меня»), 2 фрегатов («Надежда» и «Африка»), 3 транспортов и 1 пинка. Личный состав эскадры насчитывал 2261 человек. 9(20) октября 1769 года эскадра вышла из Кронштадта в Средиземное море. Эльфинстон получил задание привести подкрепление уже находившейся в турецких водах эскадре Г. А. Спиридова. Эльфинстон должен был также тотчас же по прибытии поступить под командование графа Алексея Орлова.
Общий переход из Балтийского моря в Средиземное прошёл благополучно и 9(20) мая 1770 года эскадра прибыла к берегам Мореи, в Колофинкский залив (восточный берег полуострова Пелопоннес).
11(22) мая Эльфинстон высадил у Рупины десант, который должен был направиться к Мезитре. Эльфинстон решил уже на другой день после своего прихода в Колокинфский залив пойти разыскивать турецкий флот, о котором он узнал от греков, едва только пришел. 12(23) мая он снялся с якоря и направился в залив Наполи-ди-Романья, где находился весь турецкий флот, собиравшийся выйти в море. Эльфинстон не устрашился немедленно атаковать турок, хотя для первого удара у него было в распоряжении всего 3 линейных корабля и 2 фрегата, а у турок, которыми командовал высший начальник флота капудан-паша, было 10 линейных кораблей, 5 фрегатов и 7 других, включая несколько гребных галер и судов. Русские открыли стрельбу, но турки не приняли боя и поспешили укрыться в Наполи-ди-Романья под прикрытие береговых батарей.. Бой продолжался около часа.
Бегство турецкого флота удалось потому, что внезапно наступил штиль, и русские корабли оказались совершенно неспособны к продвижению, а турецкие были отбуксированы гребными судами в глубину залива, к берегу. У русских в тот момент гребных судов не оказалось.
Только днем 17(28) мая задул легкий ветер и Эльфинстон вновь принял решение атаковать противника, и около 3 часов дня русские корабли открыли огонь. Бой продолжался около 3 часов, затем турки укрылись под стенами Наполи-де-Романья, полагая, что ведут бой с растянувшимся русским флотом. Бой закончился безрезультатно.
Эльфинстон сначала было попробовал блокировать в этой бухте турецкий флот, но через 5 дней отошёл ввиду подавляющего превосходства турецких сил. Уйдя, он соединился со Спиридовым, и они вместе, по настоянию Спиридова, вернулись в Наполи-ди-Романья, однако турок уже не застали: Гасан-бей со своим флотом бежал по направлению к Хиосу. Спиридов негодовал на Эльфинстона, упустившего турок, и адмиралы очень крупно поссорились. В соответствии с инструкциями, данными Екатериной ??, адмирал Г. Спиридов и контр-адмирал Д. Эльфинстон были поставлены в равное положение, и ни один из них не был подчинен другому, что приводило к конфликтным ситуациям между ними.
Прибытие 11(22) июня Орлова несколько разрядило ситуацию, Орлов принял общее командование на себя, Эльфинстон и Спиридов стали его заместителями. Объединенный русский флот стал преследовать турецкий.
24 июня Эльфинстон в составе объединенной русской эскадры принял участие в Хиосском сражении, где командовал замыкающим дивизионом из 3 кораблей (держал флаг на «Не тронь меня»), а через день и в Чесменском сражении.
После Чесменского сражения эскадра Эльфинстона направилась к острову Тенедос с целью блокировать Дарданеллы. Эльфинстон при блокаде Дарданелл действовал решительно, но непоследовательно. С одной стороны именно он был сторонником прорыва русского флота через Дарданеллы и хотел победить путем решительного наступления. А Орлов не был столь решителен и запретил этот манёвр, Эльфинстон был вынужден ограничиться демонстрацией и блокадой Дарданелл. Но при всей решительности и храбрости Эльфинстон совершил очень странный поступок — самовольно, без приказа вышестоящего Орлова и без вызова Спиридова покинул отряд, блокировавший Дарданеллы, и на 84-х пушечном самом мощном в эскадре линейном корабле «Святослав» направился на остров Лемнос. 5(16) сентября 1770 года при подходе к острову «Святослав» на полном ходу под всеми парусами в свежую погоду наткнулся на риф у северной стороны Лемноса а затем оказался на мели. На корабле открылась сильная течь. Эльфинстон приказал срубить все мачты и выбросить часть тяжестей за борт, но это не помогло снять «Святослав» с камней. Эльфинстону пришлось вызвать на помощь остальные корабли блокирующего отряда из под Дарданелл. Шесть суток, днем и ночью, экипаж «Святослава» пытался спасти свой корабль, но безуспешно. Его пришлось разоружить и сжечь, чтобы он не достался противнику. Турки, воспользовавшись этим, перебросили значительные подкрепления на остров Лемнос. Таким образом, по вине Эльфинстона русскому флоту пришлось снять осаду крепости Пелари и покинуть Лемнос. Непосредственным виновником аварии оказался английский подданный лоцман Гордон, нанятый Эльфинстоном. Моряки предупреждали Эльфинстона о некомпетентности лоцмана, но Эльфинстон не внял этим предупреждениям. Военно-морской суд признал его ответственным за самовольный уход от Дарданелл, за принятие на службу неблагонадежного лоцмана и за аварию, приведшую к гибели корабля. Лоцман Гордон, приговоренный к смертной казни, ухитрился бежать, а Эльфинстон был доставлен в порт Мудрос, где в тот момент находился Алексей Орлов. Эльфинстон был отстранен от командования и отправлен в Россию .
Орлов отправил Эльфинстона в Кронштадт и послал такой компрометирующий материал о нём, что контр-адмирала отдали под суд, обвиняя в служебной небрежности, которая погубила линейный корабль «Святослав». Суд формально не обвинил Эльфинстона, однако служить ему дальше в русском флоте уже не пришось — 19 июля 1774 года он был уволен в отставку и навсегда покинул Россию. В свое оправдание им был написан мемуар, по поводу которого сохранились замечания императрицы Екатерины II:
После увольнения с русской службы Эльфинстон вернулся в английский флот. В ходе войны за независимость США в 1779-80 годах он участвовал в боевых действиях в Вест-Индии. При Гренаде в эскадре вице-адмирала Байрона и Мартинике в эскадре вице-адмирала Родни командовал HMS Magnificent.
В 1783 году командовал HMS Atlas.
Умер в 1785 году, в возрасте 63 лет.