Как обратиться к объекту в массиве, зная значение его свойства не через цикл?
только перебором.[{id: 1}, {id: 2}].find(item => item.id === 1) //{id: 1}UPD
Можно попробовать нормализовать данные, т.е сделать плоский объект, который будет хранить значения нужного объекта и указывать на его индексconst data = [
	{ id: 1, title: 'foo', notUniqueKey: 1 },
	{ id: 2, title: 'bar', notUniqueKey: 2 },
	{ id: 3, title: 'baz', notUniqueKey: 1 },
]

const flatify = (data = [], uniqueKeys = []) => {
	const o = {}
	
	data.forEach((item, index) => {
		Object
			.keys(item)
			.forEach(key => {
				if (uniqueKeys.indexOf(key) !== -1) {
					o[item[key]] = index
				}
			})
	})
	
	return o
}

const bindings = flatify(data, ['id', 'title'])

console.log(data[bindings[1]]) // по id
console.log(data[bindings['baz']]) // по title
может не знаю какой то хак в JS, как обойтись без цикловЕсть такой хак. Называется "правильный выбор структуры данных". Работает, кстати, не только в js.
Можно, например, вести отдельный словарь, в котором в качестве ключей используются значения свойств, а в качестве значений - индексы в массиве. Или ещё десяток вариантов, всё зависит от структуры и особенностей конкретного приложения.