Because .toString() can be called on almost any value while .toISOString() can only be called on Date objects1.
This code:
const date = new Date();
temp = date.setDate(date.getDate() - date.getDay()).toISOString();
is effectively the same as
const date = new Date();
const setDateReturnValue = date.setDate(date.getDate() - date.getDay());
setDateReturnValue.toISOString();
Note that date and setDateReturnValue hold two different values. The date is the Date object and setDateReturnValue is the return value of Date.prototype.setDate(), which is a number.
A number doesn't have a .toISOString() method, which is what is causing the error. A Date does have a .toISOString() method, which is why your first code snippet works fine.
Both a Date and a number have a .toString() method2, which is why those work fine, but do realize that the string they return is different in a different format. (The number will return the number as a string, where the date will return something like "Wed Sep 07 2022 16:17:40 GMT+0200 (Central European Summer Time)")
[1]: Unless of course you or a library defines this function for different types.
[2]: Technically speaking: a number a primitive and as such, doesn't have a .toString() method (or any method for that matter), but when calling a method on a number, it will be boxed into a Number object, which does have a .toString() method.