Jeśli ten obrazek ma być użyty tylko raz, to może po prostu zwróć Ajaxem zasób obrazka? Wtedy wystarczy:
header('Content-Type: image/webp');
// tutaj tworzysz swój obrazek
imagewebp($image);
Ustawianie Content-Type nie jest niezbędne w Twoim przypadku (zadziała bez tego), ale jednak wypada podać

Potem na tej podstawie konwertujesz do base64 i przypisujesz src="data:image/webp;base64,TwójBase64"
EDIT
Z ciekawości sprawdziłem czy działa łatwo z Fetch API i na szczęście tak

Zobacz ten przykład:
1. Masz jakiś obrazek w pliku obrazek.jpg. Ten obrazek będziemy przekształcać i zapisywać jako webp.
2. Plik obrazek.php, gdzie przekształcasz obrazek i go "wypluwasz":
<?php
header('Content-Type: image/webp');
$image = imagecreatefromjpeg('obrazek.jpg');
// tutaj możesz się bawić obrazkiem
imagewebp($image);
3. I przykładowy HTML, gdzie to się dzieje:
document.querySelector('button').addEventListener('click', async () => {
const response = await fetch('obrazek.php');
const resource = await response.blob();
document.images[0].src = URL.createObjectURL(resource);
});
Działa pięknie

Dla kompletności mojej odpowiedzi jeszcze dodam, że oczywiście możesz ustawić src obrazka bezpośrednio na plik .php:
Jeżeli plik PHP wypluwa obrazek tak jak nasz obrazek.php, to <img> sobie poradzi - nawet bez Content-Type lub z nieprawidłowym Content-Type.
Jeżeli musisz wysłać do tego pliku dużo danych lub np. wysyłasz mu obrazek źródłowy, to Fetch API lub Ajax będą na miejscu. Ale jeśli chodzi o prostą operację np. pokazania TIFF jako webp, ustawienie src na plik PHP może wystarczyć. Zakładając, że te obrazki TIFF są na serwerze i tylko mówisz skryptowi który obrazek ma wyświetlić jako webp, możesz np. podawać ten obrazek źródłowy jako parametr w zwykłym GET:
const sourceFileName = document.getElementById('my-input').value;
document.getElementById('my-image').src = 'http://foo.test/obrazek.php?source=' + encodeURIComponent(sourceFileName);
I to wystarczy.